diff --git a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h index 4cd607c0d0c8d..386bdb3cf5875 100644 --- a/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h +++ b/llvm/include/llvm/Analysis/TargetTransformInfoImpl.h @@ -1473,9 +1473,6 @@ class TargetTransformInfoImplCRTPBase : public TargetTransformInfoImplBase { OpInfo, I); } case Instruction::Load: { - // FIXME: Arbitary cost which could come from the backend. - if (CostKind == TTI::TCK_Latency) - return 4; auto *LI = cast(U); Type *LoadType = U->getType(); // If there is a non-register sized type, the cost estimation may expand diff --git a/llvm/lib/Target/LoongArch/LoongArchTargetTransformInfo.cpp b/llvm/lib/Target/LoongArch/LoongArchTargetTransformInfo.cpp index f548a8dd0532b..288af40fc5656 100644 --- a/llvm/lib/Target/LoongArch/LoongArchTargetTransformInfo.cpp +++ b/llvm/lib/Target/LoongArch/LoongArchTargetTransformInfo.cpp @@ -14,11 +14,48 @@ //===----------------------------------------------------------------------===// #include "LoongArchTargetTransformInfo.h" +#include "llvm/Analysis/TargetTransformInfo.h" +#include "llvm/CodeGen/CostTable.h" +#include "llvm/CodeGen/ISDOpcodes.h" +#include "llvm/IR/InstrTypes.h" +#include "llvm/Support/InstructionCost.h" +#include using namespace llvm; #define DEBUG_TYPE "loongarchtti" +struct CostKindCosts { + unsigned LatencyCost = ~0U; + unsigned RecipThroughputCost = ~0U; + unsigned CodeSizeCost = ~0U; + unsigned SizeAndLatencyCost = ~0U; + + std::optional + operator[](TargetTransformInfo::TargetCostKind Kind) const { + unsigned Cost = ~0U; + switch (Kind) { + case llvm::TargetTransformInfo::TCK_Latency: + Cost = LatencyCost; + break; + case TargetTransformInfo::TCK_RecipThroughput: + Cost = RecipThroughputCost; + break; + case TargetTransformInfo::TCK_CodeSize: + Cost = CodeSizeCost; + break; + case TargetTransformInfo::TCK_SizeAndLatency: + Cost = SizeAndLatencyCost; + break; + } + if (Cost == ~0U) + return std::nullopt; + return Cost; + } +}; +using CostKindTblEntry = CostTblEntryT; +using TypeConversionCostTblEntry = TypeConversionCostTblEntryT; + TypeSize LoongArchTTIImpl::getRegisterBitWidth( TargetTransformInfo::RegisterKind K) const { TypeSize DefSize = TargetTransformInfoImplBase::getRegisterBitWidth(K); @@ -111,4 +148,473 @@ bool LoongArchTTIImpl::shouldExpandReduction(const IntrinsicInst *II) const { } } +InstructionCost LoongArchTTIImpl::getArithmeticInstrCost( + unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind, + TTI::OperandValueInfo Op1Info, TTI::OperandValueInfo Op2Info, + ArrayRef Args, const Instruction *CxtI) const { + + std::pair LT = getTypeLegalizationCost(Ty); + int ISD = TLI->InstructionOpcodeToISD(Opcode); + + // Vector multiply by pow2 will be simplified to shifts. + // Vector multiply by -pow2 will be simplified to shifts/negates. + if (ISD == ISD::MUL && Op2Info.isConstant() && + (Op2Info.isPowerOf2() || Op2Info.isNegatedPowerOf2())) { + InstructionCost Cost = + getArithmeticInstrCost(Instruction::Shl, Ty, CostKind, + Op1Info.getNoProps(), Op2Info.getNoProps()); + if (Op2Info.isNegatedPowerOf2()) + Cost += getArithmeticInstrCost(Instruction::Sub, Ty, CostKind); + return Cost; + } + + // On LoongArch, vector signed division by constants power-of-two are + // normally expanded to the sequence SRA + SRL + ADD + SRA. + // The OperandValue properties may not be the same as that of the previous + // operation; conservatively assume OP_None. + if ((ISD == ISD::SDIV || ISD == ISD::SREM) && Op2Info.isConstant() && + Op2Info.isPowerOf2()) { + InstructionCost Cost = + 2 * getArithmeticInstrCost(Instruction::AShr, Ty, CostKind, + Op1Info.getNoProps(), Op2Info.getNoProps()); + Cost += getArithmeticInstrCost(Instruction::LShr, Ty, CostKind, + Op1Info.getNoProps(), Op2Info.getNoProps()); + Cost += getArithmeticInstrCost(Instruction::Add, Ty, CostKind, + Op1Info.getNoProps(), Op2Info.getNoProps()); + + if (ISD == ISD::SREM) { + // For SREM: (X % C) is the equivalent of (X - (X/C)*C) + Cost += + getArithmeticInstrCost(Instruction::Mul, Ty, CostKind, + Op1Info.getNoProps(), Op2Info.getNoProps()); + Cost += + getArithmeticInstrCost(Instruction::Sub, Ty, CostKind, + Op1Info.getNoProps(), Op2Info.getNoProps()); + } + + return Cost; + } + // Vector unsigned division/remainder will be simplified to shifts/masks. + if ((ISD == ISD::UDIV || ISD == ISD::UREM) && Op2Info.isConstant() && + Op2Info.isPowerOf2()) { + if (ISD == ISD::UDIV) + return getArithmeticInstrCost(Instruction::LShr, Ty, CostKind, + Op1Info.getNoProps(), Op2Info.getNoProps()); + // UREM + return getArithmeticInstrCost(Instruction::And, Ty, CostKind, + Op1Info.getNoProps(), Op2Info.getNoProps()); + } + + static const CostKindTblEntry LSXCostTable[]{ + {ISD::ADD, MVT::v16i8, {1, 1}}, // vaddi.b/vadd.b + {ISD::ADD, MVT::v8i16, {1, 1}}, // vaddi.h/vadd.h + {ISD::ADD, MVT::v4i32, {1, 1}}, // vaddi.w/vadd.w + {ISD::ADD, MVT::v2i64, {1, 1}}, // vaddi.d/vadd.d + + {ISD::SUB, MVT::v16i8, {1, 1}}, // vsubi.b/vsub.b + {ISD::SUB, MVT::v8i16, {1, 1}}, // vsubi.h/vsub.h + {ISD::SUB, MVT::v4i32, {1, 1}}, // vsubi.w/vsub.w + {ISD::SUB, MVT::v2i64, {1, 1}}, // vsubi.d/vsub.d + + {ISD::MUL, MVT::v16i8, {4, 2}}, // vmul.b + {ISD::MUL, MVT::v8i16, {4, 2}}, // vmul.h + {ISD::MUL, MVT::v4i32, {4, 2}}, // vmul.w + {ISD::MUL, MVT::v2i64, {4, 2}}, // vmul.d + + {ISD::SDIV, MVT::v16i8, {38, 76}}, // vdiv.b + {ISD::SDIV, MVT::v8i16, {24, 44}}, // vdiv.h + {ISD::SDIV, MVT::v4i32, {17, 28}}, // vdiv.w + {ISD::SDIV, MVT::v2i64, {14, 19}}, // vdiv.d + + {ISD::UDIV, MVT::v16i8, {38, 80}}, // vdiv.bu + {ISD::UDIV, MVT::v8i16, {24, 44}}, // vdiv.hu + {ISD::UDIV, MVT::v4i32, {17, 28}}, // vdiv.wu + {ISD::UDIV, MVT::v2i64, {14, 19}}, // vdiv.du + + {ISD::SREM, MVT::v16i8, {38, 76}}, // vmod.b + {ISD::SREM, MVT::v8i16, {24, 44}}, // vmod.h + {ISD::SREM, MVT::v4i32, {17, 27}}, // vmod.w + {ISD::SREM, MVT::v2i64, {14, 19}}, // vmod.d + + {ISD::UREM, MVT::v16i8, {38, 80}}, // vmod.bu + {ISD::UREM, MVT::v8i16, {24, 44}}, // vmod.hu + {ISD::UREM, MVT::v4i32, {17, 28}}, // vmod.wu + {ISD::UREM, MVT::v2i64, {14, 19}}, // vmod.du + + {ISD::SHL, MVT::v16i8, {1, 1}}, // vslli.b/vsll.b + {ISD::SHL, MVT::v8i16, {1, 1}}, // vslli.h/vsll.h + {ISD::SHL, MVT::v4i32, {1, 1}}, // vslli.w/vsll.w + {ISD::SHL, MVT::v2i64, {1, 1}}, // vslli.d/vsll.d + + {ISD::SRL, MVT::v16i8, {1, 1}}, // vsrli.b/vsrl.b + {ISD::SRL, MVT::v8i16, {1, 1}}, // vsrli.h/vsrl.h + {ISD::SRL, MVT::v4i32, {1, 1}}, // vsrli.w/vsrl.w + {ISD::SRL, MVT::v2i64, {1, 1}}, // vsrli.d/vsrl.d + + {ISD::SRA, MVT::v16i8, {1, 1}}, // vsrai.b/vsra.b + {ISD::SRA, MVT::v8i16, {1, 1}}, // vsrai.h/vsra.h + {ISD::SRA, MVT::v4i32, {1, 1}}, // vsrai.w/vsra.w + {ISD::SRA, MVT::v2i64, {1, 1}}, // vsrai.d/vsra.d + + {ISD::AND, MVT::v16i8, {1, 1}}, // vand.b/vand.v + {ISD::AND, MVT::v8i16, {1, 1}}, // vand.v + {ISD::AND, MVT::v4i32, {1, 1}}, // vand.v + {ISD::AND, MVT::v2i64, {1, 1}}, // vand.v + + {ISD::OR, MVT::v16i8, {1, 1}}, // vori.b/vor.v + {ISD::OR, MVT::v8i16, {1, 1}}, // vor.v + {ISD::OR, MVT::v4i32, {1, 1}}, // vor.v + {ISD::OR, MVT::v2i64, {1, 1}}, // vor.v + + {ISD::XOR, MVT::v16i8, {1, 1}}, // vxori.b/vxor.v + {ISD::XOR, MVT::v8i16, {1, 1}}, // vxor.v + {ISD::XOR, MVT::v4i32, {1, 1}}, // vxor.v + {ISD::XOR, MVT::v2i64, {1, 1}}, // vxor.v + + {ISD::FADD, MVT::v4f32, {3, 1}}, // vfadd.s + {ISD::FADD, MVT::v2f64, {3, 1}}, // vfadd.d + + {ISD::FSUB, MVT::v4f32, {3, 1}}, // vfsub.s + {ISD::FSUB, MVT::v2f64, {3, 1}}, // vfsub.d + + {ISD::FMUL, MVT::v4f32, {5, 2}}, // vfmul.s + {ISD::FMUL, MVT::v2f64, {5, 2}}, // vfmul.d + + {ISD::FDIV, MVT::v4f32, {16, 26}}, // vfdiv.s + {ISD::FDIV, MVT::v2f64, {12, 18}}, // vfdiv.d + }; + + if (ST->hasExtLSX()) { + if (const auto *Entry = CostTableLookup(LSXCostTable, ISD, LT.second)) + if (auto KindCost = Entry->Cost[CostKind]) + return LT.first * *KindCost; + } + + static const CostKindTblEntry LASXUniformConstCostTable[]{ + {ISD::ADD, MVT::v32i8, {1, 1}}, // xvaddi.b/xvadd.b + {ISD::ADD, MVT::v16i16, {1, 1}}, // xvaddi.h/xvadd.h + {ISD::ADD, MVT::v8i32, {1, 1}}, // xvaddi.w/xvadd.w + {ISD::ADD, MVT::v4i64, {1, 1}}, // xvaddi.d/xvadd.d + + {ISD::SUB, MVT::v32i8, {1, 1}}, // xvsubi.b/xvsub.b + {ISD::SUB, MVT::v16i16, {1, 1}}, // xvsubi.h/xvsub.h + {ISD::SUB, MVT::v8i32, {1, 1}}, // xvsubi.w/xvsub.w + {ISD::SUB, MVT::v4i64, {1, 1}}, // xvsubi.d/xvsub.d + + {ISD::MUL, MVT::v32i8, {4, 2}}, // xvmul.b + {ISD::MUL, MVT::v16i16, {4, 2}}, // xvmul.h + {ISD::MUL, MVT::v8i32, {4, 2}}, // xvmul.w + {ISD::MUL, MVT::v4i64, {4, 2}}, // xvmul.d + + {ISD::SDIV, MVT::v32i8, {38, 76}}, // xvdiv.b + {ISD::SDIV, MVT::v16i16, {24, 43}}, // xvdiv.h + {ISD::SDIV, MVT::v8i32, {17, 28}}, // xvdiv.w + {ISD::SDIV, MVT::v4i64, {14, 19}}, // xvdiv.d + + {ISD::UDIV, MVT::v32i8, {38, 76}}, // xvdiv.bu + {ISD::UDIV, MVT::v16i16, {24, 43}}, // xvdiv.hu + {ISD::UDIV, MVT::v8i32, {17, 28}}, // xvdiv.wu + {ISD::UDIV, MVT::v4i64, {14, 19}}, // xvdiv.du + + {ISD::SREM, MVT::v32i8, {38, 76}}, // xvmod.b + {ISD::SREM, MVT::v16i16, {24, 44}}, // xvmod.h + {ISD::SREM, MVT::v8i32, {17, 28}}, // xvmod.w + {ISD::SREM, MVT::v4i64, {14, 19}}, // xvmod.d + + {ISD::UREM, MVT::v32i8, {38, 76}}, // xvmod.bu + {ISD::UREM, MVT::v16i16, {24, 43}}, // xvmod.hu + {ISD::UREM, MVT::v8i32, {17, 28}}, // xvmod.wu + {ISD::UREM, MVT::v4i64, {14, 19}}, // xvmod.du + + {ISD::SHL, MVT::v32i8, {1, 1}}, // xvslli.b/xvsll.b + {ISD::SHL, MVT::v16i16, {1, 1}}, // xvslli.h/xvsll.h + {ISD::SHL, MVT::v8i32, {1, 1}}, // xvslli.w/xvsll.w + {ISD::SHL, MVT::v4i64, {1, 1}}, // xvslli.d/xvsll.d + + {ISD::SRL, MVT::v32i8, {1, 1}}, // xvsrli.b/xvsrl.b + {ISD::SRL, MVT::v16i16, {1, 1}}, // xvsrli.h/xvsrl.h + {ISD::SRL, MVT::v8i32, {1, 1}}, // xvsrli.w/xvsrl.w + {ISD::SRL, MVT::v4i64, {1, 1}}, // xvsrli.d/xvsrl.d + + {ISD::SRA, MVT::v32i8, {1, 1}}, // xvsrai.b/xvsra.b + {ISD::SRA, MVT::v16i16, {1, 1}}, // xvsrai.h/xvsra.h + {ISD::SRA, MVT::v8i32, {1, 1}}, // xvsrai.w/xvsra.w + {ISD::SRA, MVT::v4i64, {1, 1}}, // xvsrai.d/xvsra.d + + {ISD::AND, MVT::v32i8, {1, 1}}, // xvandi.b/xvand.v + {ISD::AND, MVT::v16i16, {1, 1}}, // xvand.v + {ISD::AND, MVT::v8i32, {1, 1}}, // xvand.v + {ISD::AND, MVT::v4i64, {1, 1}}, // xvand.v + + {ISD::OR, MVT::v32i8, {1, 1}}, // xvori.b/xvor.v + {ISD::OR, MVT::v16i16, {1, 1}}, // xvor.v + {ISD::OR, MVT::v8i32, {1, 1}}, // xvor.v + {ISD::OR, MVT::v4i64, {1, 1}}, // xvor.v + + {ISD::XOR, MVT::v32i8, {1, 1}}, // xvxori.b/xvxor.v + {ISD::XOR, MVT::v16i16, {1, 1}}, // xvxor.v + {ISD::XOR, MVT::v8i32, {1, 1}}, // xvxor.v + {ISD::XOR, MVT::v4i64, {1, 1}}, // xvxor.v + + {ISD::FADD, MVT::v8f32, {3, 1}}, // xvfadd.s + {ISD::FADD, MVT::v4f64, {3, 1}}, // xvfadd.d + + {ISD::FSUB, MVT::v8f32, {3, 1}}, // xvfsub.s + {ISD::FSUB, MVT::v4f64, {3, 1}}, // xvfsub.d + + {ISD::FMUL, MVT::v8f32, {5, 2}}, // xvfmul.s + {ISD::FMUL, MVT::v4f64, {5, 2}}, // xvfmul.d + + {ISD::FDIV, MVT::v8f32, {15, 26}}, // xvfdiv.s + {ISD::FDIV, MVT::v4f64, {12, 18}}, // xvfdiv.d + }; + + if (ST->hasExtLASX()) { + if (const auto *Entry = + CostTableLookup(LASXUniformConstCostTable, ISD, LT.second)) + if (auto KindCost = Entry->Cost[CostKind]) + return LT.first * *KindCost; + } + + static const CostKindTblEntry LA64CostTable[]{ + {ISD::ADD, MVT::i64, {1, 1}}, // addi.d/add.d + {ISD::SUB, MVT::i64, {1, 1}}, // subi.d/sub.d + {ISD::MUL, MVT::i64, {4, 2}}, // mul.d + + {ISD::SDIV, MVT::i64, {18, 26}}, // div.d + {ISD::UDIV, MVT::i64, {18, 26}}, // div.du + {ISD::SREM, MVT::i64, {18, 26}}, // mod.d + {ISD::UREM, MVT::i64, {18, 26}}, // mod.du + + {ISD::SHL, MVT::i64, {1, 1}}, // slli.d/sll.d + {ISD::SRL, MVT::i64, {1, 1}}, // srli.d/srl.d + {ISD::SRA, MVT::i64, {1, 1}}, // srai.d/sra.d + + {ISD::AND, MVT::i64, {1, 1}}, // andi.d/and.d + {ISD::OR, MVT::i64, {1, 1}}, // ori.d/or.d + {ISD::XOR, MVT::i64, {1, 1}}, // xori.d/xor.d + + {ISD::FADD, MVT::f64, {3, 1}}, // fadd.d + {ISD::FSUB, MVT::f64, {3, 1}}, // fsub.d + {ISD::FMUL, MVT::f64, {5, 2}}, // fmul.d + {ISD::FDIV, MVT::f64, {12, 9}}, // fdiv.d + }; + + if (ST->is64Bit()) { + if (const auto *Entry = CostTableLookup(LA64CostTable, ISD, LT.second)) + if (auto KindCost = Entry->Cost[CostKind]) + return LT.first * *KindCost; + } + + static const CostKindTblEntry LA32CostTable[]{ + {ISD::ADD, MVT::i32, {1, 1}}, // addi.w/add.w + {ISD::SUB, MVT::i32, {1, 1}}, // subi.w/sub.w + {ISD::MUL, MVT::i32, {4, 2}}, // mul.w + + {ISD::SDIV, MVT::i32, {11, 24}}, // div.w + {ISD::UDIV, MVT::i32, {12, 24}}, // div.wu + {ISD::SREM, MVT::i32, {11, 24}}, // mod.w + {ISD::UREM, MVT::i32, {12, 24}}, // mod.wu + + {ISD::SHL, MVT::i32, {1, 1}}, // slli.w/sll.w + {ISD::SRL, MVT::i32, {1, 1}}, // srli.w/srl.w + {ISD::SRA, MVT::i32, {1, 1}}, // srai.w/sra.w + + {ISD::AND, MVT::i32, {1, 1}}, // andi.w/and.w + {ISD::OR, MVT::i32, {1, 1}}, // ori.w/or.w + {ISD::XOR, MVT::i32, {1, 1}}, // xori.w/xor.w + + {ISD::FADD, MVT::f32, {3, 1}}, // fadd.s + {ISD::FSUB, MVT::f32, {3, 1}}, // fsub.s + {ISD::FMUL, MVT::f32, {5, 2}}, // fmul.s + {ISD::FDIV, MVT::f32, {9, 8}}, // fdiv.s + }; + + if (const auto *Entry = CostTableLookup(LA32CostTable, ISD, LT.second)) + if (auto KindCost = Entry->Cost[CostKind]) + return LT.first * *KindCost; + + // Fallback to the default implementation. + return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info, Op2Info, + Args, CxtI); +} + +InstructionCost LoongArchTTIImpl::getVectorInstrCost( + unsigned Opcode, Type *Val, TTI::TargetCostKind CostKind, unsigned Index, + const Value *Op0, const Value *Op1) const { + + assert(Val->isVectorTy() && "This must be a vector type"); + + std::pair LT = getTypeLegalizationCost(Val); + int ISD = TLI->InstructionOpcodeToISD(Opcode); + InstructionCost RegisterFileMoveCost = 0; + + static const CostKindTblEntry CostTable[]{ + {ISD::EXTRACT_VECTOR_ELT, MVT::i8, {3, 4}}, // vpickve2gr.b + {ISD::EXTRACT_VECTOR_ELT, MVT::i16, {3, 4}}, // vpickve2gr.h + {ISD::EXTRACT_VECTOR_ELT, MVT::i32, {3, 4}}, // vpickve2gr.w + {ISD::EXTRACT_VECTOR_ELT, MVT::i64, {3, 4}}, // vpickve2gr.d + + {ISD::EXTRACT_VECTOR_ELT, MVT::f32, {1, 1}}, // vreplvei.w + {ISD::EXTRACT_VECTOR_ELT, MVT::f64, {1, 1}}, // vreplvei.d + }; + + if (Index != -1U && + (ISD == ISD::EXTRACT_VECTOR_ELT || ISD == ISD::INSERT_VECTOR_ELT)) { + + if (!LT.second.isVector()) + return TTI::TCC_Free; + + unsigned SizeInBits = LT.second.getSizeInBits(); + unsigned NumElts = LT.second.getVectorNumElements(); + Index = Index % NumElts; + + if (SizeInBits > 128 && Index >= NumElts / 2 && !Val->isFPOrFPVectorTy()) { + RegisterFileMoveCost += (ISD == ISD::INSERT_VECTOR_ELT ? 2 : 1); + } + + if (ISD == ISD::INSERT_VECTOR_ELT) { + // vldi/vrepli + if (isa_and_nonnull(Op0) && isa_and_nonnull(Op1)) { + return 1 + RegisterFileMoveCost; + } + + // vldi + vextrins + if (isa_and_nonnull(Op1)) { + return 2 + RegisterFileMoveCost; + } + + // vextrins + if (Op1->getType()->isFloatTy() || Op1->getType()->isDoubleTy()) { + return 1 + RegisterFileMoveCost; + } + + // vinsgr2vr + if (CostKind == TTI::TCK_RecipThroughput) { + return 4 + RegisterFileMoveCost; + } else if (CostKind == TTI::TCK_Latency) { + return 3 + RegisterFileMoveCost; + } + } + + if (auto *Entry = + CostTableLookup(CostTable, ISD, LT.second.getScalarType())) + if (auto KindCost = Entry->Cost[CostKind]) + return *KindCost + RegisterFileMoveCost; + } + + return BaseT::getVectorInstrCost(Opcode, Val, CostKind, Index, Op0, Op1) + + RegisterFileMoveCost; +} + +InstructionCost LoongArchTTIImpl::getMemoryOpCost(unsigned Opcode, Type *Src, + Align Alignment, + unsigned AddressSpace, + TTI::TargetCostKind CostKind, + TTI::OperandValueInfo OpInfo, + const Instruction *I) const { + + // Legalize the type. + std::pair LT = getTypeLegalizationCost(Src); + + switch (CostKind) { + default: + return BaseT::getMemoryOpCost(Opcode, Src, Alignment, AddressSpace, + CostKind, OpInfo, I); + case TTI::TCK_RecipThroughput: + return 2 * LT.first; + case TTI::TCK_Latency: + unsigned Cost = 4; + if (Src->isFloatingPointTy() || Src->isVectorTy()) { + Cost += 1; + } + return Cost * LT.first; + } +} + +InstructionCost LoongArchTTIImpl::getCmpSelInstrCost( + unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred, + TTI::TargetCostKind CostKind, TTI::OperandValueInfo Op1Info, + TTI::OperandValueInfo Op2Info, const Instruction *I) const { + + std::pair LT = getTypeLegalizationCost(ValTy); + int ISD = TLI->InstructionOpcodeToISD(Opcode); + MVT MTy = LT.second; + + InstructionCost ExtraCost = 0; + + // [x]vsl{t/e}[i] needs extra cost + if (MTy.isVector() && MTy.getScalarSizeInBits() == 64 && + CostKind == TTI::TCK_Latency) + if (VecPred != CmpInst::ICMP_EQ && VecPred != CmpInst::ICMP_NE) + ExtraCost = 1; + + static const CostKindTblEntry LSXCostTable[] = { + {ISD::SETCC, MVT::v16i8, {1, 1}}, // veq.b/... + {ISD::SETCC, MVT::v8i16, {1, 1}}, // veq.h/... + {ISD::SETCC, MVT::v4i32, {1, 1}}, // veq.w/... + {ISD::SETCC, MVT::v2i64, {1, 1}}, // veq.d/... + + {ISD::SETCC, MVT::v4f32, {2, 1}}, // vfcmp.cond.s + {ISD::SETCC, MVT::v2f64, {2, 1}}, // vfcmp.cond.d + + {ISD::SELECT, MVT::v16i8, {1, 2}}, // vbitsel.v + {ISD::SELECT, MVT::v8i16, {1, 2}}, // vbitsel.v + {ISD::SELECT, MVT::v4i32, {1, 2}}, // vbitsel.v + {ISD::SELECT, MVT::v2i64, {1, 2}}, // vbitsel.v + + {ISD::SELECT, MVT::v4f32, {1, 2}}, // vbitsel.v + {ISD::SELECT, MVT::v2f64, {1, 2}}, // vbitsel.v + }; + + static const CostKindTblEntry LASXCostTable[] = { + {ISD::SETCC, MVT::v32i8, {1, 1}}, // xveq.b/... + {ISD::SETCC, MVT::v16i16, {1, 1}}, // xveq.h/... + {ISD::SETCC, MVT::v8i32, {1, 1}}, // xveq.w/... + {ISD::SETCC, MVT::v4i64, {1, 1}}, // xveq.d/... + + {ISD::SETCC, MVT::v2f32, {2, 1}}, // xvfcmp.cond.s + {ISD::SETCC, MVT::v4f64, {2, 1}}, // xvfcmp.cond.d + + {ISD::SELECT, MVT::v32i8, {1, 2}}, // xvbitsel.v + {ISD::SELECT, MVT::v16i16, {1, 2}}, // xvbitsel.v + {ISD::SELECT, MVT::v8i32, {1, 2}}, // xvbitsel.v + {ISD::SELECT, MVT::v4i64, {1, 2}}, // xvbitsel.v + + {ISD::SELECT, MVT::v8f32, {1, 2}}, // xvbitsel.v + {ISD::SELECT, MVT::v4f64, {1, 2}}, // xvbitsel.v + }; + + if (ST->hasExtLSX()) { + if (const auto *Entry = CostTableLookup(LSXCostTable, ISD, MTy)) + if (auto KindCost = Entry->Cost[CostKind]) + return LT.first * (ExtraCost + *KindCost); + } + + if (ST->hasExtLASX()) { + if (const auto *Entry = CostTableLookup(LASXCostTable, ISD, MTy)) + if (auto KindCost = Entry->Cost[CostKind]) + return LT.first * (ExtraCost + *KindCost); + } + + return BaseT::getCmpSelInstrCost(Opcode, ValTy, CondTy, VecPred, CostKind, + Op1Info, Op2Info, I); +} + +InstructionCost LoongArchTTIImpl::getCFInstrCost(unsigned Opcode, + TTI::TargetCostKind CostKind, + const Instruction *I) const { + if (Opcode == Instruction::PHI) { + return 0; + } + + // Branches are assumed to be predicted. + if (CostKind == TTI::TCK_RecipThroughput) { + return 4; + } + return 1; +} + +bool LoongArchTTIImpl::prefersVectorizedAddressing() const { return false; } + // TODO: Implement more hooks to provide TTI machinery for LoongArch. diff --git a/llvm/lib/Target/LoongArch/LoongArchTargetTransformInfo.h b/llvm/lib/Target/LoongArch/LoongArchTargetTransformInfo.h index e3f16c7804994..0ec7cb34b45c1 100644 --- a/llvm/lib/Target/LoongArch/LoongArchTargetTransformInfo.h +++ b/llvm/lib/Target/LoongArch/LoongArchTargetTransformInfo.h @@ -54,6 +54,35 @@ class LoongArchTTIImpl : public BasicTTIImplBase { bool enableWritePrefetching() const override; bool shouldExpandReduction(const IntrinsicInst *II) const override; + InstructionCost getArithmeticInstrCost( + unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind, + TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None}, + TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None}, + ArrayRef Args = {}, + const Instruction *CxtI = nullptr) const override; + + using BaseT::getVectorInstrCost; + InstructionCost getVectorInstrCost(unsigned Opcode, Type *Val, + TTI::TargetCostKind CostKind, + unsigned Index, const Value *Op0, + const Value *Op1) const override; + InstructionCost getMemoryOpCost( + unsigned Opcode, Type *Src, Align Alignment, unsigned AddressSpace, + TTI::TargetCostKind CostKind, + TTI::OperandValueInfo OpInfo = {TTI::OK_AnyValue, TTI::OP_None}, + const Instruction *I = nullptr) const override; + + InstructionCost getCmpSelInstrCost( + unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred, + TTI::TargetCostKind CostKind, + TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None}, + TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None}, + const Instruction *I = nullptr) const override; + + InstructionCost getCFInstrCost(unsigned Opcode, TTI::TargetCostKind CostKind, + const Instruction *I = nullptr) const override; + + bool prefersVectorizedAddressing() const override; // TODO: Implement more hooks to provide TTI machinery for LoongArch. }; diff --git a/llvm/test/Analysis/CostModel/LoongArch/arith-fp.ll b/llvm/test/Analysis/CostModel/LoongArch/arith-fp.ll new file mode 100644 index 0000000000000..6da0d72d7a2be --- /dev/null +++ b/llvm/test/Analysis/CostModel/LoongArch/arith-fp.ll @@ -0,0 +1,135 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6 +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lsx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LSX +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lasx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LASX + +define void @fadd() { +; LSX-LABEL: 'fadd' +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V1F32 = fadd float poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F32 = fadd <2 x float> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F32 = fadd <4 x float> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:6 SizeLat:1 for: %V8F32 = fadd <8 x float> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V1F64 = fadd double poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fadd <2 x double> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:6 SizeLat:1 for: %V4F64 = fadd <4 x double> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret void +; +; LASX-LABEL: 'fadd' +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V1F32 = fadd float poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F32 = fadd <2 x float> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F32 = fadd <4 x float> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V8F32 = fadd <8 x float> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V1F64 = fadd double poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fadd <2 x double> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fadd <4 x double> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret void +; + %V1F32 = fadd float poison, poison + %V2F32 = fadd <2 x float> poison, poison + %V4F32 = fadd <4 x float> poison, poison + %V8F32 = fadd <8 x float> poison, poison + + %V1F64 = fadd double poison, poison + %V2F64 = fadd <2 x double> poison, poison + %V4F64 = fadd <4 x double> poison, poison + + ret void +} + +define void @fsub() { +; LSX-LABEL: 'fsub' +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V1F32 = fsub float poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F32 = fsub <2 x float> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F32 = fsub <4 x float> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:6 SizeLat:1 for: %V8F32 = fsub <8 x float> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V1F64 = fsub double poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fsub <2 x double> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:6 SizeLat:1 for: %V4F64 = fsub <4 x double> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret void +; +; LASX-LABEL: 'fsub' +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V1F32 = fsub float poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F32 = fsub <2 x float> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F32 = fsub <4 x float> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V8F32 = fsub <8 x float> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V1F64 = fsub double poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fsub <2 x double> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fsub <4 x double> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret void +; + %V1F32 = fsub float poison, poison + %V2F32 = fsub <2 x float> poison, poison + %V4F32 = fsub <4 x float> poison, poison + %V8F32 = fsub <8 x float> poison, poison + + %V1F64 = fsub double poison, poison + %V2F64 = fsub <2 x double> poison, poison + %V4F64 = fsub <4 x double> poison, poison + + ret void +} + +define void @fmul() { +; LSX-LABEL: 'fmul' +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %V1F32 = fmul float poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %V2F32 = fmul <2 x float> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %V4F32 = fmul <4 x float> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:10 SizeLat:1 for: %V8F32 = fmul <8 x float> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %V1F64 = fmul double poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %V2F64 = fmul <2 x double> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:10 SizeLat:1 for: %V4F64 = fmul <4 x double> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret void +; +; LASX-LABEL: 'fmul' +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %V1F32 = fmul float poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %V2F32 = fmul <2 x float> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %V4F32 = fmul <4 x float> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %V8F32 = fmul <8 x float> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %V1F64 = fmul double poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %V2F64 = fmul <2 x double> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %V4F64 = fmul <4 x double> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret void +; + %V1F32 = fmul float poison, poison + %V2F32 = fmul <2 x float> poison, poison + %V4F32 = fmul <4 x float> poison, poison + %V8F32 = fmul <8 x float> poison, poison + + %V1F64 = fmul double poison, poison + %V2F64 = fmul <2 x double> poison, poison + %V4F64 = fmul <4 x double> poison, poison + + ret void +} + +define void @fdiv() { +; LSX-LABEL: 'fdiv' +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:4 Lat:9 SizeLat:4 for: %V1F32 = fdiv float poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:16 SizeLat:4 for: %V2F32 = fdiv <2 x float> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:16 SizeLat:4 for: %V4F32 = fdiv <4 x float> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:52 CodeSize:4 Lat:32 SizeLat:4 for: %V8F32 = fdiv <8 x float> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:9 CodeSize:4 Lat:12 SizeLat:4 for: %V1F64 = fdiv double poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:18 CodeSize:4 Lat:12 SizeLat:4 for: %V2F64 = fdiv <2 x double> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:36 CodeSize:4 Lat:24 SizeLat:4 for: %V4F64 = fdiv <4 x double> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret void +; +; LASX-LABEL: 'fdiv' +; LASX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:4 Lat:9 SizeLat:4 for: %V1F32 = fdiv float poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:16 SizeLat:4 for: %V2F32 = fdiv <2 x float> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:16 SizeLat:4 for: %V4F32 = fdiv <4 x float> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:15 SizeLat:4 for: %V8F32 = fdiv <8 x float> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:9 CodeSize:4 Lat:12 SizeLat:4 for: %V1F64 = fdiv double poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:18 CodeSize:4 Lat:12 SizeLat:4 for: %V2F64 = fdiv <2 x double> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:18 CodeSize:4 Lat:12 SizeLat:4 for: %V4F64 = fdiv <4 x double> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret void +; + %V1F32 = fdiv float poison, poison + %V2F32 = fdiv <2 x float> poison, poison + %V4F32 = fdiv <4 x float> poison, poison + %V8F32 = fdiv <8 x float> poison, poison + + %V1F64 = fdiv double poison, poison + %V2F64 = fdiv <2 x double> poison, poison + %V4F64 = fdiv <4 x double> poison, poison + + ret void +} diff --git a/llvm/test/Analysis/CostModel/LoongArch/arith-int.ll b/llvm/test/Analysis/CostModel/LoongArch/arith-int.ll new file mode 100644 index 0000000000000..fb449141526b1 --- /dev/null +++ b/llvm/test/Analysis/CostModel/LoongArch/arith-int.ll @@ -0,0 +1,1161 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6 + +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lsx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LSX +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lasx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LASX + +define i32 @add() { +; LSX-LABEL: 'add' +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = add i8 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = add <2 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = add <4 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = add <8 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = add <16 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V32I8 = add <32 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = add i16 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = add <2 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = add <4 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = add <8 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V16I16 = add <16 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = add i32 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = add <2 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = add <4 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V8I32 = add <8 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = add i64 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = add <2 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = add <4 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'add' +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = add i8 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = add <2 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = add <4 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = add <8 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = add <16 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = add <32 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = add i16 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = add <2 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = add <4 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = add <8 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = add <16 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = add i32 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = add <2 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = add <4 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = add <8 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = add i64 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = add <2 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I64 = add <4 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = add i8 poison, poison + %V2I8 = add <2 x i8> poison, poison + %V4I8 = add <4 x i8> poison, poison + %V8I8 = add <8 x i8> poison, poison + %V16I8 = add <16 x i8> poison, poison + %V32I8 = add <32 x i8> poison, poison + + %V1I16 = add i16 poison, poison + %V2I16 = add <2 x i16> poison, poison + %V4I16 = add <4 x i16> poison, poison + %V8I16 = add <8 x i16> poison, poison + %V16I16 = add <16 x i16> poison, poison + + %V1I32 = add i32 poison, poison + %V2I32 = add <2 x i32> poison, poison + %V4I32 = add <4 x i32> poison, poison + %V8I32 = add <8 x i32> poison, poison + + %V1I64 = add i64 poison, poison + %V2I64 = add <2 x i64> poison, poison + %V4I64 = add <4 x i64> poison, poison + + ret i32 poison +} + +define i32 @sub() { +; LSX-LABEL: 'sub' +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = sub i8 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = sub <2 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = sub <4 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = sub <8 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = sub <16 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V32I8 = sub <32 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = sub i16 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = sub <2 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = sub <4 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = sub <8 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V16I16 = sub <16 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = sub i32 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = sub <2 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = sub <4 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V8I32 = sub <8 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = sub i64 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = sub <2 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = sub <4 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'sub' +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = sub i8 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = sub <2 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = sub <4 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = sub <8 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = sub <16 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = sub <32 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = sub i16 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = sub <2 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = sub <4 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = sub <8 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = sub <16 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = sub i32 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = sub <2 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = sub <4 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = sub <8 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = sub i64 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = sub <2 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I64 = sub <4 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = sub i8 poison, poison + %V2I8 = sub <2 x i8> poison, poison + %V4I8 = sub <4 x i8> poison, poison + %V8I8 = sub <8 x i8> poison, poison + %V16I8 = sub <16 x i8> poison, poison + %V32I8 = sub <32 x i8> poison, poison + + %V1I16 = sub i16 poison, poison + %V2I16 = sub <2 x i16> poison, poison + %V4I16 = sub <4 x i16> poison, poison + %V8I16 = sub <8 x i16> poison, poison + %V16I16 = sub <16 x i16> poison, poison + + %V1I32 = sub i32 poison, poison + %V2I32 = sub <2 x i32> poison, poison + %V4I32 = sub <4 x i32> poison, poison + %V8I32 = sub <8 x i32> poison, poison + + %V1I64 = sub i64 poison, poison + %V2I64 = sub <2 x i64> poison, poison + %V4I64 = sub <4 x i64> poison, poison + + ret i32 poison +} + +define i32 @mul() { +; LSX-LABEL: 'mul' +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V1I8 = mul i8 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V2I8 = mul <2 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V4I8 = mul <4 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V8I8 = mul <8 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V16I8 = mul <16 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:8 SizeLat:1 for: %V32I8 = mul <32 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V1I16 = mul i16 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V2I16 = mul <2 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V4I16 = mul <4 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V8I16 = mul <8 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:8 SizeLat:1 for: %V16I16 = mul <16 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V1I32 = mul i32 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V2I32 = mul <2 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V4I32 = mul <4 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:8 SizeLat:1 for: %V8I32 = mul <8 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V1I64 = mul i64 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V2I64 = mul <2 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:8 SizeLat:1 for: %V4I64 = mul <4 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'mul' +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V1I8 = mul i8 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V2I8 = mul <2 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V4I8 = mul <4 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V8I8 = mul <8 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V16I8 = mul <16 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V32I8 = mul <32 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V1I16 = mul i16 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V2I16 = mul <2 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V4I16 = mul <4 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V8I16 = mul <8 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V16I16 = mul <16 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V1I32 = mul i32 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V2I32 = mul <2 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V4I32 = mul <4 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V8I32 = mul <8 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V1I64 = mul i64 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V2I64 = mul <2 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %V4I64 = mul <4 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = mul i8 poison, poison + %V2I8 = mul <2 x i8> poison, poison + %V4I8 = mul <4 x i8> poison, poison + %V8I8 = mul <8 x i8> poison, poison + %V16I8 = mul <16 x i8> poison, poison + %V32I8 = mul <32 x i8> poison, poison + + %V1I16 = mul i16 poison, poison + %V2I16 = mul <2 x i16> poison, poison + %V4I16 = mul <4 x i16> poison, poison + %V8I16 = mul <8 x i16> poison, poison + %V16I16 = mul <16 x i16> poison, poison + + %V1I32 = mul i32 poison, poison + %V2I32 = mul <2 x i32> poison, poison + %V4I32 = mul <4 x i32> poison, poison + %V8I32 = mul <8 x i32> poison, poison + + %V1I64 = mul i64 poison, poison + %V2I64 = mul <2 x i64> poison, poison + %V4I64 = mul <4 x i64> poison, poison + + ret i32 poison +} + +define i32 @sdiv() { +; LSX-LABEL: 'sdiv' +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I8 = sdiv i8 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V2I8 = sdiv <2 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V4I8 = sdiv <4 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V8I8 = sdiv <8 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V16I8 = sdiv <16 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:152 CodeSize:4 Lat:76 SizeLat:4 for: %V32I8 = sdiv <32 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I16 = sdiv i16 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V2I16 = sdiv <2 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V4I16 = sdiv <4 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V8I16 = sdiv <8 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:88 CodeSize:4 Lat:48 SizeLat:4 for: %V16I16 = sdiv <16 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I32 = sdiv i32 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V2I32 = sdiv <2 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V4I32 = sdiv <4 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:56 CodeSize:4 Lat:34 SizeLat:4 for: %V8I32 = sdiv <8 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I64 = sdiv i64 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:19 CodeSize:4 Lat:14 SizeLat:4 for: %V2I64 = sdiv <2 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:38 CodeSize:4 Lat:28 SizeLat:4 for: %V4I64 = sdiv <4 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'sdiv' +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I8 = sdiv i8 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V2I8 = sdiv <2 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V4I8 = sdiv <4 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V8I8 = sdiv <8 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V16I8 = sdiv <16 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V32I8 = sdiv <32 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I16 = sdiv i16 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V2I16 = sdiv <2 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V4I16 = sdiv <4 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V8I16 = sdiv <8 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:43 CodeSize:4 Lat:24 SizeLat:4 for: %V16I16 = sdiv <16 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I32 = sdiv i32 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V2I32 = sdiv <2 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V4I32 = sdiv <4 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V8I32 = sdiv <8 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I64 = sdiv i64 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:19 CodeSize:4 Lat:14 SizeLat:4 for: %V2I64 = sdiv <2 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:19 CodeSize:4 Lat:14 SizeLat:4 for: %V4I64 = sdiv <4 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = sdiv i8 poison, poison + %V2I8 = sdiv <2 x i8> poison, poison + %V4I8 = sdiv <4 x i8> poison, poison + %V8I8 = sdiv <8 x i8> poison, poison + %V16I8 = sdiv <16 x i8> poison, poison + %V32I8 = sdiv <32 x i8> poison, poison + + %V1I16 = sdiv i16 poison, poison + %V2I16 = sdiv <2 x i16> poison, poison + %V4I16 = sdiv <4 x i16> poison, poison + %V8I16 = sdiv <8 x i16> poison, poison + %V16I16 = sdiv <16 x i16> poison, poison + + %V1I32 = sdiv i32 poison, poison + %V2I32 = sdiv <2 x i32> poison, poison + %V4I32 = sdiv <4 x i32> poison, poison + %V8I32 = sdiv <8 x i32> poison, poison + + %V1I64 = sdiv i64 poison, poison + %V2I64 = sdiv <2 x i64> poison, poison + %V4I64 = sdiv <4 x i64> poison, poison + + ret i32 poison +} + +define i32 @udiv() { +; LSX-LABEL: 'udiv' +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I8 = udiv i8 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V2I8 = udiv <2 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V4I8 = udiv <4 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V8I8 = udiv <8 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V16I8 = udiv <16 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:160 CodeSize:4 Lat:76 SizeLat:4 for: %V32I8 = udiv <32 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I16 = udiv i16 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V2I16 = udiv <2 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V4I16 = udiv <4 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V8I16 = udiv <8 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:88 CodeSize:4 Lat:48 SizeLat:4 for: %V16I16 = udiv <16 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I32 = udiv i32 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V2I32 = udiv <2 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V4I32 = udiv <4 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:56 CodeSize:4 Lat:34 SizeLat:4 for: %V8I32 = udiv <8 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I64 = udiv i64 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:19 CodeSize:4 Lat:14 SizeLat:4 for: %V2I64 = udiv <2 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:38 CodeSize:4 Lat:28 SizeLat:4 for: %V4I64 = udiv <4 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'udiv' +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I8 = udiv i8 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V2I8 = udiv <2 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V4I8 = udiv <4 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V8I8 = udiv <8 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V16I8 = udiv <16 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V32I8 = udiv <32 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I16 = udiv i16 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V2I16 = udiv <2 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V4I16 = udiv <4 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V8I16 = udiv <8 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:43 CodeSize:4 Lat:24 SizeLat:4 for: %V16I16 = udiv <16 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I32 = udiv i32 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V2I32 = udiv <2 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V4I32 = udiv <4 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V8I32 = udiv <8 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I64 = udiv i64 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:19 CodeSize:4 Lat:14 SizeLat:4 for: %V2I64 = udiv <2 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:19 CodeSize:4 Lat:14 SizeLat:4 for: %V4I64 = udiv <4 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = udiv i8 poison, poison + %V2I8 = udiv <2 x i8> poison, poison + %V4I8 = udiv <4 x i8> poison, poison + %V8I8 = udiv <8 x i8> poison, poison + %V16I8 = udiv <16 x i8> poison, poison + %V32I8 = udiv <32 x i8> poison, poison + + %V1I16 = udiv i16 poison, poison + %V2I16 = udiv <2 x i16> poison, poison + %V4I16 = udiv <4 x i16> poison, poison + %V8I16 = udiv <8 x i16> poison, poison + %V16I16 = udiv <16 x i16> poison, poison + + %V1I32 = udiv i32 poison, poison + %V2I32 = udiv <2 x i32> poison, poison + %V4I32 = udiv <4 x i32> poison, poison + %V8I32 = udiv <8 x i32> poison, poison + + %V1I64 = udiv i64 poison, poison + %V2I64 = udiv <2 x i64> poison, poison + %V4I64 = udiv <4 x i64> poison, poison + + ret i32 poison +} + +define i32 @srem() { +; LSX-LABEL: 'srem' +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I8 = srem i8 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V2I8 = srem <2 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V4I8 = srem <4 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V8I8 = srem <8 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V16I8 = srem <16 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:152 CodeSize:4 Lat:76 SizeLat:4 for: %V32I8 = srem <32 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I16 = srem i16 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V2I16 = srem <2 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V4I16 = srem <4 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V8I16 = srem <8 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:88 CodeSize:4 Lat:48 SizeLat:4 for: %V16I16 = srem <16 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I32 = srem i32 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:27 CodeSize:4 Lat:17 SizeLat:4 for: %V2I32 = srem <2 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:27 CodeSize:4 Lat:17 SizeLat:4 for: %V4I32 = srem <4 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:54 CodeSize:4 Lat:34 SizeLat:4 for: %V8I32 = srem <8 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I64 = srem i64 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:19 CodeSize:4 Lat:14 SizeLat:4 for: %V2I64 = srem <2 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:38 CodeSize:4 Lat:28 SizeLat:4 for: %V4I64 = srem <4 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'srem' +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I8 = srem i8 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V2I8 = srem <2 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V4I8 = srem <4 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V8I8 = srem <8 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V16I8 = srem <16 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V32I8 = srem <32 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I16 = srem i16 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V2I16 = srem <2 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V4I16 = srem <4 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V8I16 = srem <8 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V16I16 = srem <16 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I32 = srem i32 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:27 CodeSize:4 Lat:17 SizeLat:4 for: %V2I32 = srem <2 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:27 CodeSize:4 Lat:17 SizeLat:4 for: %V4I32 = srem <4 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V8I32 = srem <8 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I64 = srem i64 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:19 CodeSize:4 Lat:14 SizeLat:4 for: %V2I64 = srem <2 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:19 CodeSize:4 Lat:14 SizeLat:4 for: %V4I64 = srem <4 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = srem i8 poison, poison + %V2I8 = srem <2 x i8> poison, poison + %V4I8 = srem <4 x i8> poison, poison + %V8I8 = srem <8 x i8> poison, poison + %V16I8 = srem <16 x i8> poison, poison + %V32I8 = srem <32 x i8> poison, poison + + %V1I16 = srem i16 poison, poison + %V2I16 = srem <2 x i16> poison, poison + %V4I16 = srem <4 x i16> poison, poison + %V8I16 = srem <8 x i16> poison, poison + %V16I16 = srem <16 x i16> poison, poison + + %V1I32 = srem i32 poison, poison + %V2I32 = srem <2 x i32> poison, poison + %V4I32 = srem <4 x i32> poison, poison + %V8I32 = srem <8 x i32> poison, poison + + %V1I64 = srem i64 poison, poison + %V2I64 = srem <2 x i64> poison, poison + %V4I64 = srem <4 x i64> poison, poison + + ret i32 poison +} + +define i32 @urem() { +; LSX-LABEL: 'urem' +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I8 = urem i8 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V2I8 = urem <2 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V4I8 = urem <4 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V8I8 = urem <8 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V16I8 = urem <16 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:160 CodeSize:4 Lat:76 SizeLat:4 for: %V32I8 = urem <32 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I16 = urem i16 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V2I16 = urem <2 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V4I16 = urem <4 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V8I16 = urem <8 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:88 CodeSize:4 Lat:48 SizeLat:4 for: %V16I16 = urem <16 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I32 = urem i32 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V2I32 = urem <2 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V4I32 = urem <4 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:56 CodeSize:4 Lat:34 SizeLat:4 for: %V8I32 = urem <8 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I64 = urem i64 poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:19 CodeSize:4 Lat:14 SizeLat:4 for: %V2I64 = urem <2 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:38 CodeSize:4 Lat:28 SizeLat:4 for: %V4I64 = urem <4 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'urem' +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I8 = urem i8 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V2I8 = urem <2 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V4I8 = urem <4 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V8I8 = urem <8 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:80 CodeSize:4 Lat:38 SizeLat:4 for: %V16I8 = urem <16 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:76 CodeSize:4 Lat:38 SizeLat:4 for: %V32I8 = urem <32 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I16 = urem i16 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V2I16 = urem <2 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V4I16 = urem <4 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:44 CodeSize:4 Lat:24 SizeLat:4 for: %V8I16 = urem <8 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:43 CodeSize:4 Lat:24 SizeLat:4 for: %V16I16 = urem <16 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I32 = urem i32 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V2I32 = urem <2 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V4I32 = urem <4 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:28 CodeSize:4 Lat:17 SizeLat:4 for: %V8I32 = urem <8 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:26 CodeSize:4 Lat:18 SizeLat:4 for: %V1I64 = urem i64 poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:19 CodeSize:4 Lat:14 SizeLat:4 for: %V2I64 = urem <2 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of RThru:19 CodeSize:4 Lat:14 SizeLat:4 for: %V4I64 = urem <4 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = urem i8 poison, poison + %V2I8 = urem <2 x i8> poison, poison + %V4I8 = urem <4 x i8> poison, poison + %V8I8 = urem <8 x i8> poison, poison + %V16I8 = urem <16 x i8> poison, poison + %V32I8 = urem <32 x i8> poison, poison + + %V1I16 = urem i16 poison, poison + %V2I16 = urem <2 x i16> poison, poison + %V4I16 = urem <4 x i16> poison, poison + %V8I16 = urem <8 x i16> poison, poison + %V16I16 = urem <16 x i16> poison, poison + + %V1I32 = urem i32 poison, poison + %V2I32 = urem <2 x i32> poison, poison + %V4I32 = urem <4 x i32> poison, poison + %V8I32 = urem <8 x i32> poison, poison + + %V1I64 = urem i64 poison, poison + %V2I64 = urem <2 x i64> poison, poison + %V4I64 = urem <4 x i64> poison, poison + + ret i32 poison +} + +define i32 @and() { +; LSX-LABEL: 'and' +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = and i8 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = and <2 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = and <4 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = and <8 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = and <16 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V32I8 = and <32 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = and i16 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = and <2 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = and <4 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = and <8 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V16I16 = and <16 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = and i32 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = and <2 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = and <4 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V8I32 = and <8 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = and i64 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = and <2 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = and <4 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'and' +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = and i8 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = and <2 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = and <4 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = and <8 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = and <16 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = and <32 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = and i16 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = and <2 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = and <4 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = and <8 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = and <16 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = and i32 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = and <2 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = and <4 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = and <8 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = and i64 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = and <2 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I64 = and <4 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = and i8 poison, poison + %V2I8 = and <2 x i8> poison, poison + %V4I8 = and <4 x i8> poison, poison + %V8I8 = and <8 x i8> poison, poison + %V16I8 = and <16 x i8> poison, poison + %V32I8 = and <32 x i8> poison, poison + + %V1I16 = and i16 poison, poison + %V2I16 = and <2 x i16> poison, poison + %V4I16 = and <4 x i16> poison, poison + %V8I16 = and <8 x i16> poison, poison + %V16I16 = and <16 x i16> poison, poison + + %V1I32 = and i32 poison, poison + %V2I32 = and <2 x i32> poison, poison + %V4I32 = and <4 x i32> poison, poison + %V8I32 = and <8 x i32> poison, poison + + %V1I64 = and i64 poison, poison + %V2I64 = and <2 x i64> poison, poison + %V4I64 = and <4 x i64> poison, poison + + ret i32 poison +} + +define i32 @or() { +; LSX-LABEL: 'or' +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = or i8 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = or <2 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = or <4 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = or <8 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = or <16 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V32I8 = or <32 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = or i16 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = or <2 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = or <4 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = or <8 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V16I16 = or <16 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = or i32 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = or <2 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = or <4 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V8I32 = or <8 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = or i64 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = or <2 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = or <4 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'or' +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = or i8 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = or <2 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = or <4 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = or <8 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = or <16 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = or <32 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = or i16 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = or <2 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = or <4 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = or <8 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = or <16 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = or i32 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = or <2 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = or <4 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = or <8 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = or i64 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = or <2 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I64 = or <4 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = or i8 poison, poison + %V2I8 = or <2 x i8> poison, poison + %V4I8 = or <4 x i8> poison, poison + %V8I8 = or <8 x i8> poison, poison + %V16I8 = or <16 x i8> poison, poison + %V32I8 = or <32 x i8> poison, poison + + %V1I16 = or i16 poison, poison + %V2I16 = or <2 x i16> poison, poison + %V4I16 = or <4 x i16> poison, poison + %V8I16 = or <8 x i16> poison, poison + %V16I16 = or <16 x i16> poison, poison + + %V1I32 = or i32 poison, poison + %V2I32 = or <2 x i32> poison, poison + %V4I32 = or <4 x i32> poison, poison + %V8I32 = or <8 x i32> poison, poison + + %V1I64 = or i64 poison, poison + %V2I64 = or <2 x i64> poison, poison + %V4I64 = or <4 x i64> poison, poison + + ret i32 poison +} + +define i32 @xor() { +; LSX-LABEL: 'xor' +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = xor i8 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = xor <2 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = xor <4 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = xor <8 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = xor <16 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V32I8 = xor <32 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = xor i16 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = xor <2 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = xor <4 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = xor <8 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V16I16 = xor <16 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = xor i32 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = xor <2 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = xor <4 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V8I32 = xor <8 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = xor i64 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = xor <2 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = xor <4 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'xor' +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = xor i8 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = xor <2 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = xor <4 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = xor <8 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = xor <16 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = xor <32 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = xor i16 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = xor <2 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = xor <4 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = xor <8 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = xor <16 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = xor i32 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = xor <2 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = xor <4 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = xor <8 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = xor i64 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = xor <2 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I64 = xor <4 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = xor i8 poison, poison + %V2I8 = xor <2 x i8> poison, poison + %V4I8 = xor <4 x i8> poison, poison + %V8I8 = xor <8 x i8> poison, poison + %V16I8 = xor <16 x i8> poison, poison + %V32I8 = xor <32 x i8> poison, poison + + %V1I16 = xor i16 poison, poison + %V2I16 = xor <2 x i16> poison, poison + %V4I16 = xor <4 x i16> poison, poison + %V8I16 = xor <8 x i16> poison, poison + %V16I16 = xor <16 x i16> poison, poison + + %V1I32 = xor i32 poison, poison + %V2I32 = xor <2 x i32> poison, poison + %V4I32 = xor <4 x i32> poison, poison + %V8I32 = xor <8 x i32> poison, poison + + %V1I64 = xor i64 poison, poison + %V2I64 = xor <2 x i64> poison, poison + %V4I64 = xor <4 x i64> poison, poison + + ret i32 poison +} + +define i32 @shl() { +; LSX-LABEL: 'shl' +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = shl i8 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = shl <2 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = shl <4 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = shl <8 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = shl <16 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V32I8 = shl <32 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = shl i16 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = shl <2 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = shl <4 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = shl <8 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V16I16 = shl <16 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = shl i32 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = shl <2 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = shl <4 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V8I32 = shl <8 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = shl i64 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = shl <2 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = shl <4 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'shl' +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = shl i8 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = shl <2 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = shl <4 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = shl <8 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = shl <16 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = shl <32 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = shl i16 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = shl <2 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = shl <4 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = shl <8 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = shl <16 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = shl i32 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = shl <2 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = shl <4 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = shl <8 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = shl i64 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = shl <2 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I64 = shl <4 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = shl i8 poison, poison + %V2I8 = shl <2 x i8> poison, poison + %V4I8 = shl <4 x i8> poison, poison + %V8I8 = shl <8 x i8> poison, poison + %V16I8 = shl <16 x i8> poison, poison + %V32I8 = shl <32 x i8> poison, poison + + %V1I16 = shl i16 poison, poison + %V2I16 = shl <2 x i16> poison, poison + %V4I16 = shl <4 x i16> poison, poison + %V8I16 = shl <8 x i16> poison, poison + %V16I16 = shl <16 x i16> poison, poison + + %V1I32 = shl i32 poison, poison + %V2I32 = shl <2 x i32> poison, poison + %V4I32 = shl <4 x i32> poison, poison + %V8I32 = shl <8 x i32> poison, poison + + %V1I64 = shl i64 poison, poison + %V2I64 = shl <2 x i64> poison, poison + %V4I64 = shl <4 x i64> poison, poison + + ret i32 poison +} + +define i32 @lshr() { +; LSX-LABEL: 'lshr' +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = lshr i8 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = lshr <2 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = lshr <4 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = lshr <8 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = lshr <16 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V32I8 = lshr <32 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = lshr i16 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = lshr <2 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = lshr <4 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = lshr <8 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V16I16 = lshr <16 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = lshr i32 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = lshr <2 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = lshr <4 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V8I32 = lshr <8 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = lshr i64 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = lshr <2 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = lshr <4 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'lshr' +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = lshr i8 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = lshr <2 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = lshr <4 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = lshr <8 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = lshr <16 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = lshr <32 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = lshr i16 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = lshr <2 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = lshr <4 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = lshr <8 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = lshr <16 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = lshr i32 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = lshr <2 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = lshr <4 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = lshr <8 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = lshr i64 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = lshr <2 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I64 = lshr <4 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = lshr i8 poison, poison + %V2I8 = lshr <2 x i8> poison, poison + %V4I8 = lshr <4 x i8> poison, poison + %V8I8 = lshr <8 x i8> poison, poison + %V16I8 = lshr <16 x i8> poison, poison + %V32I8 = lshr <32 x i8> poison, poison + + %V1I16 = lshr i16 poison, poison + %V2I16 = lshr <2 x i16> poison, poison + %V4I16 = lshr <4 x i16> poison, poison + %V8I16 = lshr <8 x i16> poison, poison + %V16I16 = lshr <16 x i16> poison, poison + + %V1I32 = lshr i32 poison, poison + %V2I32 = lshr <2 x i32> poison, poison + %V4I32 = lshr <4 x i32> poison, poison + %V8I32 = lshr <8 x i32> poison, poison + + %V1I64 = lshr i64 poison, poison + %V2I64 = lshr <2 x i64> poison, poison + %V4I64 = lshr <4 x i64> poison, poison + + ret i32 poison +} + +define i32 @ashr() { +; LSX-LABEL: 'ashr' +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = ashr i8 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = ashr <2 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = ashr <4 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = ashr <8 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = ashr <16 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V32I8 = ashr <32 x i8> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = ashr i16 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = ashr <2 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = ashr <4 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = ashr <8 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V16I16 = ashr <16 x i16> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = ashr i32 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = ashr <2 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = ashr <4 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V8I32 = ashr <8 x i32> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = ashr i64 poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = ashr <2 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = ashr <4 x i64> poison, poison +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'ashr' +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = ashr i8 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = ashr <2 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = ashr <4 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = ashr <8 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = ashr <16 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = ashr <32 x i8> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = ashr i16 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = ashr <2 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = ashr <4 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = ashr <8 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = ashr <16 x i16> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = ashr i32 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = ashr <2 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = ashr <4 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = ashr <8 x i32> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = ashr i64 poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = ashr <2 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I64 = ashr <4 x i64> poison, poison +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = ashr i8 poison, poison + %V2I8 = ashr <2 x i8> poison, poison + %V4I8 = ashr <4 x i8> poison, poison + %V8I8 = ashr <8 x i8> poison, poison + %V16I8 = ashr <16 x i8> poison, poison + %V32I8 = ashr <32 x i8> poison, poison + + %V1I16 = ashr i16 poison, poison + %V2I16 = ashr <2 x i16> poison, poison + %V4I16 = ashr <4 x i16> poison, poison + %V8I16 = ashr <8 x i16> poison, poison + %V16I16 = ashr <16 x i16> poison, poison + + %V1I32 = ashr i32 poison, poison + %V2I32 = ashr <2 x i32> poison, poison + %V4I32 = ashr <4 x i32> poison, poison + %V8I32 = ashr <8 x i32> poison, poison + + %V1I64 = ashr i64 poison, poison + %V2I64 = ashr <2 x i64> poison, poison + %V4I64 = ashr <4 x i64> poison, poison + + ret i32 poison +} + + +define i32 @sdiv_constant() { +; LSX-LABEL: 'sdiv_constant' +; LSX-NEXT: Cost Model: Found costs of 4 for: %V1I8 = sdiv i8 poison, 2 +; LSX-NEXT: Cost Model: Found costs of 4 for: %V2I8 = sdiv <2 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of 4 for: %V4I8 = sdiv <4 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of 4 for: %V8I8 = sdiv <8 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of 4 for: %V16I8 = sdiv <16 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:4 Lat:8 SizeLat:4 for: %V32I8 = sdiv <32 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of 4 for: %V1I16 = sdiv i16 poison, 2 +; LSX-NEXT: Cost Model: Found costs of 4 for: %V2I16 = sdiv <2 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of 4 for: %V4I16 = sdiv <4 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of 4 for: %V8I16 = sdiv <8 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:4 Lat:8 SizeLat:4 for: %V16I16 = sdiv <16 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of 4 for: %V1I32 = sdiv i32 poison, 2 +; LSX-NEXT: Cost Model: Found costs of 4 for: %V2I32 = sdiv <2 x i32> poison, splat (i32 2) +; LSX-NEXT: Cost Model: Found costs of 4 for: %V4I32 = sdiv <4 x i32> poison, splat (i32 2) +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:4 Lat:8 SizeLat:4 for: %V8I32 = sdiv <8 x i32> poison, splat (i32 2) +; LSX-NEXT: Cost Model: Found costs of 4 for: %V1I64 = sdiv i64 poison, 2 +; LSX-NEXT: Cost Model: Found costs of 4 for: %V2I64 = sdiv <2 x i64> poison, splat (i64 2) +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:4 Lat:8 SizeLat:4 for: %V4I64 = sdiv <4 x i64> poison, splat (i64 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'sdiv_constant' +; LASX-NEXT: Cost Model: Found costs of 4 for: %V1I8 = sdiv i8 poison, 2 +; LASX-NEXT: Cost Model: Found costs of 4 for: %V2I8 = sdiv <2 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 4 for: %V4I8 = sdiv <4 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 4 for: %V8I8 = sdiv <8 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 4 for: %V16I8 = sdiv <16 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 4 for: %V32I8 = sdiv <32 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 4 for: %V1I16 = sdiv i16 poison, 2 +; LASX-NEXT: Cost Model: Found costs of 4 for: %V2I16 = sdiv <2 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of 4 for: %V4I16 = sdiv <4 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of 4 for: %V8I16 = sdiv <8 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of 4 for: %V16I16 = sdiv <16 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of 4 for: %V1I32 = sdiv i32 poison, 2 +; LASX-NEXT: Cost Model: Found costs of 4 for: %V2I32 = sdiv <2 x i32> poison, splat (i32 2) +; LASX-NEXT: Cost Model: Found costs of 4 for: %V4I32 = sdiv <4 x i32> poison, splat (i32 2) +; LASX-NEXT: Cost Model: Found costs of 4 for: %V8I32 = sdiv <8 x i32> poison, splat (i32 2) +; LASX-NEXT: Cost Model: Found costs of 4 for: %V1I64 = sdiv i64 poison, 2 +; LASX-NEXT: Cost Model: Found costs of 4 for: %V2I64 = sdiv <2 x i64> poison, splat (i64 2) +; LASX-NEXT: Cost Model: Found costs of 4 for: %V4I64 = sdiv <4 x i64> poison, splat (i64 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = sdiv i8 poison, 2 + %V2I8 = sdiv <2 x i8> poison, splat (i8 2) + %V4I8 = sdiv <4 x i8> poison, splat (i8 2) + %V8I8 = sdiv <8 x i8> poison, splat (i8 2) + %V16I8 = sdiv <16 x i8> poison, splat (i8 2) + %V32I8 = sdiv <32 x i8> poison, splat (i8 2) + + %V1I16 = sdiv i16 poison, 2 + %V2I16 = sdiv <2 x i16> poison, splat (i16 2) + %V4I16 = sdiv <4 x i16> poison, splat (i16 2) + %V8I16 = sdiv <8 x i16> poison, splat (i16 2) + %V16I16 = sdiv <16 x i16> poison, splat (i16 2) + + %V1I32 = sdiv i32 poison, 2 + %V2I32 = sdiv <2 x i32> poison, splat (i32 2) + %V4I32 = sdiv <4 x i32> poison, splat (i32 2) + %V8I32 = sdiv <8 x i32> poison, splat (i32 2) + + %V1I64 = sdiv i64 poison, 2 + %V2I64 = sdiv <2 x i64> poison, splat (i64 2) + %V4I64 = sdiv <4 x i64> poison, splat (i64 2) + + ret i32 poison +} + +define i32 @udiv_constant() { +; LSX-LABEL: 'udiv_constant' +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = udiv i8 poison, 2 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = udiv <2 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = udiv <4 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = udiv <8 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = udiv <16 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V32I8 = udiv <32 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = udiv i16 poison, 2 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = udiv <2 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = udiv <4 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = udiv <8 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V16I16 = udiv <16 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = udiv i32 poison, 2 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = udiv <2 x i32> poison, splat (i32 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = udiv <4 x i32> poison, splat (i32 2) +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V8I32 = udiv <8 x i32> poison, splat (i32 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = udiv i64 poison, 2 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = udiv <2 x i64> poison, splat (i64 2) +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = udiv <4 x i64> poison, splat (i64 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'udiv_constant' +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = udiv i8 poison, 2 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = udiv <2 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = udiv <4 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = udiv <8 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = udiv <16 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = udiv <32 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = udiv i16 poison, 2 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = udiv <2 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = udiv <4 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = udiv <8 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = udiv <16 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = udiv i32 poison, 2 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = udiv <2 x i32> poison, splat (i32 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = udiv <4 x i32> poison, splat (i32 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = udiv <8 x i32> poison, splat (i32 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = udiv i64 poison, 2 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = udiv <2 x i64> poison, splat (i64 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I64 = udiv <4 x i64> poison, splat (i64 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = udiv i8 poison, 2 + %V2I8 = udiv <2 x i8> poison, splat (i8 2) + %V4I8 = udiv <4 x i8> poison, splat (i8 2) + %V8I8 = udiv <8 x i8> poison, splat (i8 2) + %V16I8 = udiv <16 x i8> poison, splat (i8 2) + %V32I8 = udiv <32 x i8> poison, splat (i8 2) + + %V1I16 = udiv i16 poison, 2 + %V2I16 = udiv <2 x i16> poison, splat (i16 2) + %V4I16 = udiv <4 x i16> poison, splat (i16 2) + %V8I16 = udiv <8 x i16> poison, splat (i16 2) + %V16I16 = udiv <16 x i16> poison, splat (i16 2) + + %V1I32 = udiv i32 poison, 2 + %V2I32 = udiv <2 x i32> poison, splat (i32 2) + %V4I32 = udiv <4 x i32> poison, splat (i32 2) + %V8I32 = udiv <8 x i32> poison, splat (i32 2) + + %V1I64 = udiv i64 poison, 2 + %V2I64 = udiv <2 x i64> poison, splat (i64 2) + %V4I64 = udiv <4 x i64> poison, splat (i64 2) + + ret i32 poison +} + +define i32 @srem_constant() { +; LSX-LABEL: 'srem_constant' +; LSX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V1I8 = srem i8 poison, 2 +; LSX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V2I8 = srem <2 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V4I8 = srem <4 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V8I8 = srem <8 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V16I8 = srem <16 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of RThru:14 CodeSize:6 Lat:18 SizeLat:6 for: %V32I8 = srem <32 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V1I16 = srem i16 poison, 2 +; LSX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V2I16 = srem <2 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V4I16 = srem <4 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V8I16 = srem <8 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of RThru:14 CodeSize:6 Lat:18 SizeLat:6 for: %V16I16 = srem <16 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V1I32 = srem i32 poison, 2 +; LSX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V2I32 = srem <2 x i32> poison, splat (i32 2) +; LSX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V4I32 = srem <4 x i32> poison, splat (i32 2) +; LSX-NEXT: Cost Model: Found costs of RThru:14 CodeSize:6 Lat:18 SizeLat:6 for: %V8I32 = srem <8 x i32> poison, splat (i32 2) +; LSX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V1I64 = srem i64 poison, 2 +; LSX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V2I64 = srem <2 x i64> poison, splat (i64 2) +; LSX-NEXT: Cost Model: Found costs of RThru:14 CodeSize:6 Lat:18 SizeLat:6 for: %V4I64 = srem <4 x i64> poison, splat (i64 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'srem_constant' +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V1I8 = srem i8 poison, 2 +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V2I8 = srem <2 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V4I8 = srem <4 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V8I8 = srem <8 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V16I8 = srem <16 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V32I8 = srem <32 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V1I16 = srem i16 poison, 2 +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V2I16 = srem <2 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V4I16 = srem <4 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V8I16 = srem <8 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V16I16 = srem <16 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V1I32 = srem i32 poison, 2 +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V2I32 = srem <2 x i32> poison, splat (i32 2) +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V4I32 = srem <4 x i32> poison, splat (i32 2) +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V8I32 = srem <8 x i32> poison, splat (i32 2) +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V1I64 = srem i64 poison, 2 +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V2I64 = srem <2 x i64> poison, splat (i64 2) +; LASX-NEXT: Cost Model: Found costs of RThru:7 CodeSize:6 Lat:9 SizeLat:6 for: %V4I64 = srem <4 x i64> poison, splat (i64 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = srem i8 poison, 2 + %V2I8 = srem <2 x i8> poison, splat (i8 2) + %V4I8 = srem <4 x i8> poison, splat (i8 2) + %V8I8 = srem <8 x i8> poison, splat (i8 2) + %V16I8 = srem <16 x i8> poison, splat (i8 2) + %V32I8 = srem <32 x i8> poison, splat (i8 2) + + %V1I16 = srem i16 poison, 2 + %V2I16 = srem <2 x i16> poison, splat (i16 2) + %V4I16 = srem <4 x i16> poison, splat (i16 2) + %V8I16 = srem <8 x i16> poison, splat (i16 2) + %V16I16 = srem <16 x i16> poison, splat (i16 2) + + %V1I32 = srem i32 poison, 2 + %V2I32 = srem <2 x i32> poison, splat (i32 2) + %V4I32 = srem <4 x i32> poison, splat (i32 2) + %V8I32 = srem <8 x i32> poison, splat (i32 2) + + %V1I64 = srem i64 poison, 2 + %V2I64 = srem <2 x i64> poison, splat (i64 2) + %V4I64 = srem <4 x i64> poison, splat (i64 2) + + ret i32 poison +} + +define i32 @urem_constant() { +; LSX-LABEL: 'urem_constant' +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = urem i8 poison, 2 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = urem <2 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = urem <4 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = urem <8 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = urem <16 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V32I8 = urem <32 x i8> poison, splat (i8 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = urem i16 poison, 2 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = urem <2 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = urem <4 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = urem <8 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V16I16 = urem <16 x i16> poison, splat (i16 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = urem i32 poison, 2 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = urem <2 x i32> poison, splat (i32 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = urem <4 x i32> poison, splat (i32 2) +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V8I32 = urem <8 x i32> poison, splat (i32 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = urem i64 poison, 2 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = urem <2 x i64> poison, splat (i64 2) +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = urem <4 x i64> poison, splat (i64 2) +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'urem_constant' +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I8 = urem i8 poison, 2 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I8 = urem <2 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I8 = urem <4 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I8 = urem <8 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = urem <16 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = urem <32 x i8> poison, splat (i8 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I16 = urem i16 poison, 2 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I16 = urem <2 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I16 = urem <4 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = urem <8 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = urem <16 x i16> poison, splat (i16 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I32 = urem i32 poison, 2 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I32 = urem <2 x i32> poison, splat (i32 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = urem <4 x i32> poison, splat (i32 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = urem <8 x i32> poison, splat (i32 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V1I64 = urem i64 poison, 2 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = urem <2 x i64> poison, splat (i64 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I64 = urem <4 x i64> poison, splat (i64 2) +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %V1I8 = urem i8 poison, 2 + %V2I8 = urem <2 x i8> poison, splat (i8 2) + %V4I8 = urem <4 x i8> poison, splat (i8 2) + %V8I8 = urem <8 x i8> poison, splat (i8 2) + %V16I8 = urem <16 x i8> poison, splat (i8 2) + %V32I8 = urem <32 x i8> poison, splat (i8 2) + + %V1I16 = urem i16 poison, 2 + %V2I16 = urem <2 x i16> poison, splat (i16 2) + %V4I16 = urem <4 x i16> poison, splat (i16 2) + %V8I16 = urem <8 x i16> poison, splat (i16 2) + %V16I16 = urem <16 x i16> poison, splat (i16 2) + + %V1I32 = urem i32 poison, 2 + %V2I32 = urem <2 x i32> poison, splat (i32 2) + %V4I32 = urem <4 x i32> poison, splat (i32 2) + %V8I32 = urem <8 x i32> poison, splat (i32 2) + + %V1I64 = urem i64 poison, 2 + %V2I64 = urem <2 x i64> poison, splat (i64 2) + %V4I64 = urem <4 x i64> poison, splat (i64 2) + + ret i32 poison +} diff --git a/llvm/test/Analysis/CostModel/LoongArch/fcmp.ll b/llvm/test/Analysis/CostModel/LoongArch/fcmp.ll new file mode 100644 index 0000000000000..9a03235e4b4aa --- /dev/null +++ b/llvm/test/Analysis/CostModel/LoongArch/fcmp.ll @@ -0,0 +1,532 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6 +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lsx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LSX +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lasx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LASX + + +define i32 @cmp_float_oeq(i32 %arg) { +; LSX-LABEL: 'cmp_float_oeq' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp oeq float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp oeq <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp oeq <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp oeq <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp oeq double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp oeq <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp oeq <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_oeq' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp oeq float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp oeq <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp oeq <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp oeq <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp oeq double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp oeq <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp oeq <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp oeq float undef, undef + %V2F32 = fcmp oeq <2 x float> undef, undef + %V4F32 = fcmp oeq <4 x float> undef, undef + %V8F32 = fcmp oeq <8 x float> undef, undef + + %F64 = fcmp oeq double undef, undef + %V2F64 = fcmp oeq <2 x double> undef, undef + %V4F64 = fcmp oeq <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_one(i32 %arg) { +; LSX-LABEL: 'cmp_float_one' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp one float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp one <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp one <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp one <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp one double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp one <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp one <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_one' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp one float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp one <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp one <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp one <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp one double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp one <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp one <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp one float undef, undef + %V2F32 = fcmp one <2 x float> undef, undef + %V4F32 = fcmp one <4 x float> undef, undef + %V8F32 = fcmp one <8 x float> undef, undef + + %F64 = fcmp one double undef, undef + %V2F64 = fcmp one <2 x double> undef, undef + %V4F64 = fcmp one <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_ord(i32 %arg) { +; LSX-LABEL: 'cmp_float_ord' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp ord float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp ord <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp ord <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp ord <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp ord double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp ord <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp ord <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_ord' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp ord float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp ord <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp ord <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp ord <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp ord double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp ord <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp ord <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp ord float undef, undef + %V2F32 = fcmp ord <2 x float> undef, undef + %V4F32 = fcmp ord <4 x float> undef, undef + %V8F32 = fcmp ord <8 x float> undef, undef + + %F64 = fcmp ord double undef, undef + %V2F64 = fcmp ord <2 x double> undef, undef + %V4F64 = fcmp ord <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_oge(i32 %arg) { +; LSX-LABEL: 'cmp_float_oge' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp oge float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp oge <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp oge <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp oge <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp oge double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp oge <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp oge <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_oge' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp oge float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp oge <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp oge <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp oge <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp oge double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp oge <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp oge <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp oge float undef, undef + %V2F32 = fcmp oge <2 x float> undef, undef + %V4F32 = fcmp oge <4 x float> undef, undef + %V8F32 = fcmp oge <8 x float> undef, undef + + %F64 = fcmp oge double undef, undef + %V2F64 = fcmp oge <2 x double> undef, undef + %V4F64 = fcmp oge <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_ogt(i32 %arg) { +; LSX-LABEL: 'cmp_float_ogt' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp ogt float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp ogt <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp ogt <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp ogt <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp ogt double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp ogt <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp ogt <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_ogt' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp ogt float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp ogt <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp ogt <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp ogt <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp ogt double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp ogt <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp ogt <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp ogt float undef, undef + %V2F32 = fcmp ogt <2 x float> undef, undef + %V4F32 = fcmp ogt <4 x float> undef, undef + %V8F32 = fcmp ogt <8 x float> undef, undef + + %F64 = fcmp ogt double undef, undef + %V2F64 = fcmp ogt <2 x double> undef, undef + %V4F64 = fcmp ogt <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_ole(i32 %arg) { +; LSX-LABEL: 'cmp_float_ole' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp ole float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp ole <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp ole <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp ole <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp ole double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp ole <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp ole <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_ole' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp ole float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp ole <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp ole <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp ole <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp ole double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp ole <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp ole <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp ole float undef, undef + %V2F32 = fcmp ole <2 x float> undef, undef + %V4F32 = fcmp ole <4 x float> undef, undef + %V8F32 = fcmp ole <8 x float> undef, undef + + %F64 = fcmp ole double undef, undef + %V2F64 = fcmp ole <2 x double> undef, undef + %V4F64 = fcmp ole <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_olt(i32 %arg) { +; LSX-LABEL: 'cmp_float_olt' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp olt float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp olt <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp olt <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp olt <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp olt double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp olt <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp olt <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_olt' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp olt float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp olt <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp olt <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp olt <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp olt double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp olt <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp olt <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp olt float undef, undef + %V2F32 = fcmp olt <2 x float> undef, undef + %V4F32 = fcmp olt <4 x float> undef, undef + %V8F32 = fcmp olt <8 x float> undef, undef + + %F64 = fcmp olt double undef, undef + %V2F64 = fcmp olt <2 x double> undef, undef + %V4F64 = fcmp olt <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_ueq(i32 %arg) { +; LSX-LABEL: 'cmp_float_ueq' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp ueq float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp ueq <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp ueq <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp ueq <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp ueq double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp ueq <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp ueq <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_ueq' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp ueq float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp ueq <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp ueq <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp ueq <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp ueq double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp ueq <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp ueq <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp ueq float undef, undef + %V2F32 = fcmp ueq <2 x float> undef, undef + %V4F32 = fcmp ueq <4 x float> undef, undef + %V8F32 = fcmp ueq <8 x float> undef, undef + + %F64 = fcmp ueq double undef, undef + %V2F64 = fcmp ueq <2 x double> undef, undef + %V4F64 = fcmp ueq <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_une(i32 %arg) { +; LSX-LABEL: 'cmp_float_une' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp une float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp une <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp une <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp une <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp une double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp une <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp une <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_une' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp une float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp une <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp une <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp une <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp une double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp une <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp une <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp une float undef, undef + %V2F32 = fcmp une <2 x float> undef, undef + %V4F32 = fcmp une <4 x float> undef, undef + %V8F32 = fcmp une <8 x float> undef, undef + + %F64 = fcmp une double undef, undef + %V2F64 = fcmp une <2 x double> undef, undef + %V4F64 = fcmp une <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_uno(i32 %arg) { +; LSX-LABEL: 'cmp_float_uno' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp uno float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp uno <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp uno <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp uno <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp uno double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp uno <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp uno <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_uno' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp uno float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp uno <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp uno <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp uno <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp uno double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp uno <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp uno <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp uno float undef, undef + %V2F32 = fcmp uno <2 x float> undef, undef + %V4F32 = fcmp uno <4 x float> undef, undef + %V8F32 = fcmp uno <8 x float> undef, undef + + %F64 = fcmp uno double undef, undef + %V2F64 = fcmp uno <2 x double> undef, undef + %V4F64 = fcmp uno <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_uge(i32 %arg) { +; LSX-LABEL: 'cmp_float_uge' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp uge float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp uge <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp uge <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp uge <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp uge double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp uge <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp uge <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_uge' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp uge float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp uge <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp uge <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp uge <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp uge double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp uge <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp uge <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp uge float undef, undef + %V2F32 = fcmp uge <2 x float> undef, undef + %V4F32 = fcmp uge <4 x float> undef, undef + %V8F32 = fcmp uge <8 x float> undef, undef + + %F64 = fcmp uge double undef, undef + %V2F64 = fcmp uge <2 x double> undef, undef + %V4F64 = fcmp uge <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_ugt(i32 %arg) { +; LSX-LABEL: 'cmp_float_ugt' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp ugt float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp ugt <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp ugt <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp ugt <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp ugt double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp ugt <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp ugt <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_ugt' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp ugt float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp ugt <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp ugt <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp ugt <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp ugt double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp ugt <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp ugt <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp ugt float undef, undef + %V2F32 = fcmp ugt <2 x float> undef, undef + %V4F32 = fcmp ugt <4 x float> undef, undef + %V8F32 = fcmp ugt <8 x float> undef, undef + + %F64 = fcmp ugt double undef, undef + %V2F64 = fcmp ugt <2 x double> undef, undef + %V4F64 = fcmp ugt <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_ule(i32 %arg) { +; LSX-LABEL: 'cmp_float_ule' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp ule float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp ule <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp ule <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp ule <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp ule double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp ule <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp ule <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_ule' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp ule float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp ule <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp ule <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp ule <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp ule double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp ule <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp ule <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp ule float undef, undef + %V2F32 = fcmp ule <2 x float> undef, undef + %V4F32 = fcmp ule <4 x float> undef, undef + %V8F32 = fcmp ule <8 x float> undef, undef + + %F64 = fcmp ule double undef, undef + %V2F64 = fcmp ule <2 x double> undef, undef + %V4F64 = fcmp ule <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_ult(i32 %arg) { +; LSX-LABEL: 'cmp_float_ult' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp ult float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp ult <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp ult <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp ult <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp ult double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp ult <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp ult <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_ult' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp ult float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp ult <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp ult <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp ult <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp ult double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp ult <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp ult <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp ult float undef, undef + %V2F32 = fcmp ult <2 x float> undef, undef + %V4F32 = fcmp ult <4 x float> undef, undef + %V8F32 = fcmp ult <8 x float> undef, undef + + %F64 = fcmp ult double undef, undef + %V2F64 = fcmp ult <2 x double> undef, undef + %V4F64 = fcmp ult <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_false(i32 %arg) { +; LSX-LABEL: 'cmp_float_false' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp false float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp false <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp false <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp false <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp false double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp false <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp false <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_false' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp false float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp false <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp false <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp false <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp false double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp false <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp false <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp false float undef, undef + %V2F32 = fcmp false <2 x float> undef, undef + %V4F32 = fcmp false <4 x float> undef, undef + %V8F32 = fcmp false <8 x float> undef, undef + + %F64 = fcmp false double undef, undef + %V2F64 = fcmp false <2 x double> undef, undef + %V4F64 = fcmp false <4 x double> undef, undef + + ret i32 undef +} + +define i32 @cmp_float_true(i32 %arg) { +; LSX-LABEL: 'cmp_float_true' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp true float undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp true <2 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp true <4 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V8F32 = fcmp true <8 x float> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp true double undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp true <2 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:6 SizeLat:2 for: %V4F64 = fcmp true <4 x double> undef, undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_float_true' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = fcmp true float undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2F32 = fcmp true <2 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4F32 = fcmp true <4 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8F32 = fcmp true <8 x float> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = fcmp true double undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V2F64 = fcmp true <2 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %V4F64 = fcmp true <4 x double> undef, undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F32 = fcmp true float undef, undef + %V2F32 = fcmp true <2 x float> undef, undef + %V4F32 = fcmp true <4 x float> undef, undef + %V8F32 = fcmp true <8 x float> undef, undef + + %F64 = fcmp true double undef, undef + %V2F64 = fcmp true <2 x double> undef, undef + %V4F64 = fcmp true <4 x double> undef, undef + + ret i32 undef +} diff --git a/llvm/test/Analysis/CostModel/LoongArch/icmp.ll b/llvm/test/Analysis/CostModel/LoongArch/icmp.ll new file mode 100644 index 0000000000000..bb0879d25f68f --- /dev/null +++ b/llvm/test/Analysis/CostModel/LoongArch/icmp.ll @@ -0,0 +1,471 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6 +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lsx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LSX +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lasx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LASX + +define i32 @cmp_int_eq(i8 %arg8, <16 x i8> %argv16i8, <32 x i8> %argv32i8, i16 %arg16, <8 x i16> %argv8i16, <16 x i16> %argv16i16, i32 %arg32, <4 x i32> %argv4i32, <8 x i32> %argv8i32, i64 %arg64, <2 x i64> %argv2i64, <4 x i64> %argv4i64) { +; LSX-LABEL: 'cmp_int_eq' +; LSX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp eq i8 %arg8, %arg8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp eq <16 x i8> %argv16i8, %argv16i8 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V32I8 = icmp eq <32 x i8> %argv32i8, %argv32i8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp eq i16 %arg16, %arg16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp eq <8 x i16> %argv8i16, %argv8i16 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V16I16 = icmp eq <16 x i16> %argv16i16, %argv16i16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp eq i32 %arg32, %arg32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp eq <4 x i32> %argv4i32, %argv4i32 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V8I32 = icmp eq <8 x i32> %argv8i32, %argv8i32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp eq i64 %arg64, %arg64 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = icmp eq <2 x i64> %argv2i64, %argv2i64 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V4I64 = icmp eq <4 x i64> %argv4i64, %argv4i64 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_int_eq' +; LASX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp eq i8 %arg8, %arg8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp eq <16 x i8> %argv16i8, %argv16i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = icmp eq <32 x i8> %argv32i8, %argv32i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp eq i16 %arg16, %arg16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp eq <8 x i16> %argv8i16, %argv8i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = icmp eq <16 x i16> %argv16i16, %argv16i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp eq i32 %arg32, %arg32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp eq <4 x i32> %argv4i32, %argv4i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = icmp eq <8 x i32> %argv8i32, %argv8i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp eq i64 %arg64, %arg64 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = icmp eq <2 x i64> %argv2i64, %argv2i64 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I64 = icmp eq <4 x i64> %argv4i64, %argv4i64 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %I8 = icmp eq i8 %arg8, %arg8 + %V16I8 = icmp eq <16 x i8> %argv16i8, %argv16i8 + %V32I8 = icmp eq <32 x i8> %argv32i8, %argv32i8 + + %I16 = icmp eq i16 %arg16, %arg16 + %V8I16 = icmp eq <8 x i16> %argv8i16, %argv8i16 + %V16I16 = icmp eq <16 x i16> %argv16i16, %argv16i16 + + %I32 = icmp eq i32 %arg32, %arg32 + %V4I32 = icmp eq <4 x i32> %argv4i32, %argv4i32 + %V8I32 = icmp eq <8 x i32> %argv8i32, %argv8i32 + + %I64 = icmp eq i64 %arg64, %arg64 + %V2I64 = icmp eq <2 x i64> %argv2i64, %argv2i64 + %V4I64 = icmp eq <4 x i64> %argv4i64, %argv4i64 + + ret i32 undef +} + +define i32 @cmp_int_ne(i8 %arg8, <16 x i8> %argv16i8, <32 x i8> %argv32i8, i16 %arg16, <8 x i16> %argv8i16, <16 x i16> %argv16i16, i32 %arg32, <4 x i32> %argv4i32, <8 x i32> %argv8i32, i64 %arg64, <2 x i64> %argv2i64, <4 x i64> %argv4i64) { +; LSX-LABEL: 'cmp_int_ne' +; LSX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp ne i8 %arg8, %arg8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp ne <16 x i8> %argv16i8, %argv16i8 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V32I8 = icmp ne <32 x i8> %argv32i8, %argv32i8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp ne i16 %arg16, %arg16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp ne <8 x i16> %argv8i16, %argv8i16 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V16I16 = icmp ne <16 x i16> %argv16i16, %argv16i16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp ne i32 %arg32, %arg32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp ne <4 x i32> %argv4i32, %argv4i32 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V8I32 = icmp ne <8 x i32> %argv8i32, %argv8i32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp ne i64 %arg64, %arg64 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = icmp ne <2 x i64> %argv2i64, %argv2i64 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V4I64 = icmp ne <4 x i64> %argv4i64, %argv4i64 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_int_ne' +; LASX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp ne i8 %arg8, %arg8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp ne <16 x i8> %argv16i8, %argv16i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = icmp ne <32 x i8> %argv32i8, %argv32i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp ne i16 %arg16, %arg16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp ne <8 x i16> %argv8i16, %argv8i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = icmp ne <16 x i16> %argv16i16, %argv16i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp ne i32 %arg32, %arg32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp ne <4 x i32> %argv4i32, %argv4i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = icmp ne <8 x i32> %argv8i32, %argv8i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp ne i64 %arg64, %arg64 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V2I64 = icmp ne <2 x i64> %argv2i64, %argv2i64 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I64 = icmp ne <4 x i64> %argv4i64, %argv4i64 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %I8 = icmp ne i8 %arg8, %arg8 + %V16I8 = icmp ne <16 x i8> %argv16i8, %argv16i8 + %V32I8 = icmp ne <32 x i8> %argv32i8, %argv32i8 + + %I16 = icmp ne i16 %arg16, %arg16 + %V8I16 = icmp ne <8 x i16> %argv8i16, %argv8i16 + %V16I16 = icmp ne <16 x i16> %argv16i16, %argv16i16 + + %I32 = icmp ne i32 %arg32, %arg32 + %V4I32 = icmp ne <4 x i32> %argv4i32, %argv4i32 + %V8I32 = icmp ne <8 x i32> %argv8i32, %argv8i32 + + %I64 = icmp ne i64 %arg64, %arg64 + %V2I64 = icmp ne <2 x i64> %argv2i64, %argv2i64 + %V4I64 = icmp ne <4 x i64> %argv4i64, %argv4i64 + + ret i32 undef +} + +define i32 @cmp_int_sge(i8 %arg8, <16 x i8> %argv16i8, <32 x i8> %argv32i8, i16 %arg16, <8 x i16> %argv8i16, <16 x i16> %argv16i16, i32 %arg32, <4 x i32> %argv4i32, <8 x i32> %argv8i32, i64 %arg64, <2 x i64> %argv2i64, <4 x i64> %argv4i64) { +; LSX-LABEL: 'cmp_int_sge' +; LSX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp sge i8 %arg8, %arg8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp sge <16 x i8> %argv16i8, %argv16i8 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V32I8 = icmp sge <32 x i8> %argv32i8, %argv32i8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp sge i16 %arg16, %arg16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp sge <8 x i16> %argv8i16, %argv8i16 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V16I16 = icmp sge <16 x i16> %argv16i16, %argv16i16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp sge i32 %arg32, %arg32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp sge <4 x i32> %argv4i32, %argv4i32 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V8I32 = icmp sge <8 x i32> %argv8i32, %argv8i32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp sge i64 %arg64, %arg64 +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp sge <2 x i64> %argv2i64, %argv2i64 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V4I64 = icmp sge <4 x i64> %argv4i64, %argv4i64 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_int_sge' +; LASX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp sge i8 %arg8, %arg8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp sge <16 x i8> %argv16i8, %argv16i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = icmp sge <32 x i8> %argv32i8, %argv32i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp sge i16 %arg16, %arg16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp sge <8 x i16> %argv8i16, %argv8i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = icmp sge <16 x i16> %argv16i16, %argv16i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp sge i32 %arg32, %arg32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp sge <4 x i32> %argv4i32, %argv4i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = icmp sge <8 x i32> %argv8i32, %argv8i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp sge i64 %arg64, %arg64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp sge <2 x i64> %argv2i64, %argv2i64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = icmp sge <4 x i64> %argv4i64, %argv4i64 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %I8 = icmp sge i8 %arg8, %arg8 + %V16I8 = icmp sge <16 x i8> %argv16i8, %argv16i8 + %V32I8 = icmp sge <32 x i8> %argv32i8, %argv32i8 + %I16 = icmp sge i16 %arg16, %arg16 + %V8I16 = icmp sge <8 x i16> %argv8i16, %argv8i16 + %V16I16 = icmp sge <16 x i16> %argv16i16, %argv16i16 + %I32 = icmp sge i32 %arg32, %arg32 + %V4I32 = icmp sge <4 x i32> %argv4i32, %argv4i32 + %V8I32 = icmp sge <8 x i32> %argv8i32, %argv8i32 + %I64 = icmp sge i64 %arg64, %arg64 + %V2I64 = icmp sge <2 x i64> %argv2i64, %argv2i64 + %V4I64 = icmp sge <4 x i64> %argv4i64, %argv4i64 + ret i32 undef +} + +define i32 @cmp_int_uge(i8 %arg8, <16 x i8> %argv16i8, <32 x i8> %argv32i8, i16 %arg16, <8 x i16> %argv8i16, <16 x i16> %argv16i16, i32 %arg32, <4 x i32> %argv4i32, <8 x i32> %argv8i32, i64 %arg64, <2 x i64> %argv2i64, <4 x i64> %argv4i64) { +; LSX-LABEL: 'cmp_int_uge' +; LSX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp uge i8 %arg8, %arg8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp uge <16 x i8> %argv16i8, %argv16i8 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V32I8 = icmp uge <32 x i8> %argv32i8, %argv32i8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp uge i16 %arg16, %arg16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp uge <8 x i16> %argv8i16, %argv8i16 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V16I16 = icmp uge <16 x i16> %argv16i16, %argv16i16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp uge i32 %arg32, %arg32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp uge <4 x i32> %argv4i32, %argv4i32 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V8I32 = icmp uge <8 x i32> %argv8i32, %argv8i32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp uge i64 %arg64, %arg64 +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp uge <2 x i64> %argv2i64, %argv2i64 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V4I64 = icmp uge <4 x i64> %argv4i64, %argv4i64 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_int_uge' +; LASX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp uge i8 %arg8, %arg8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp uge <16 x i8> %argv16i8, %argv16i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = icmp uge <32 x i8> %argv32i8, %argv32i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp uge i16 %arg16, %arg16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp uge <8 x i16> %argv8i16, %argv8i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = icmp uge <16 x i16> %argv16i16, %argv16i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp uge i32 %arg32, %arg32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp uge <4 x i32> %argv4i32, %argv4i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = icmp uge <8 x i32> %argv8i32, %argv8i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp uge i64 %arg64, %arg64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp uge <2 x i64> %argv2i64, %argv2i64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = icmp uge <4 x i64> %argv4i64, %argv4i64 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %I8 = icmp uge i8 %arg8, %arg8 + %V16I8 = icmp uge <16 x i8> %argv16i8, %argv16i8 + %V32I8 = icmp uge <32 x i8> %argv32i8, %argv32i8 + %I16 = icmp uge i16 %arg16, %arg16 + %V8I16 = icmp uge <8 x i16> %argv8i16, %argv8i16 + %V16I16 = icmp uge <16 x i16> %argv16i16, %argv16i16 + %I32 = icmp uge i32 %arg32, %arg32 + %V4I32 = icmp uge <4 x i32> %argv4i32, %argv4i32 + %V8I32 = icmp uge <8 x i32> %argv8i32, %argv8i32 + %I64 = icmp uge i64 %arg64, %arg64 + %V2I64 = icmp uge <2 x i64> %argv2i64, %argv2i64 + %V4I64 = icmp uge <4 x i64> %argv4i64, %argv4i64 + ret i32 undef +} + +define i32 @cmp_int_sgt(i8 %arg8, <16 x i8> %argv16i8, <32 x i8> %argv32i8, i16 %arg16, <8 x i16> %argv8i16, <16 x i16> %argv16i16, i32 %arg32, <4 x i32> %argv4i32, <8 x i32> %argv8i32, i64 %arg64, <2 x i64> %argv2i64, <4 x i64> %argv4i64) { +; LSX-LABEL: 'cmp_int_sgt' +; LSX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp sgt i8 %arg8, %arg8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp sgt <16 x i8> %argv16i8, %argv16i8 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V32I8 = icmp sgt <32 x i8> %argv32i8, %argv32i8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp sgt i16 %arg16, %arg16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp sgt <8 x i16> %argv8i16, %argv8i16 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V16I16 = icmp sgt <16 x i16> %argv16i16, %argv16i16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp sgt i32 %arg32, %arg32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp sgt <4 x i32> %argv4i32, %argv4i32 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V8I32 = icmp sgt <8 x i32> %argv8i32, %argv8i32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp sgt i64 %arg64, %arg64 +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp sgt <2 x i64> %argv2i64, %argv2i64 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V4I64 = icmp sgt <4 x i64> %argv4i64, %argv4i64 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_int_sgt' +; LASX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp sgt i8 %arg8, %arg8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp sgt <16 x i8> %argv16i8, %argv16i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = icmp sgt <32 x i8> %argv32i8, %argv32i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp sgt i16 %arg16, %arg16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp sgt <8 x i16> %argv8i16, %argv8i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = icmp sgt <16 x i16> %argv16i16, %argv16i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp sgt i32 %arg32, %arg32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp sgt <4 x i32> %argv4i32, %argv4i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = icmp sgt <8 x i32> %argv8i32, %argv8i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp sgt i64 %arg64, %arg64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp sgt <2 x i64> %argv2i64, %argv2i64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = icmp sgt <4 x i64> %argv4i64, %argv4i64 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %I8 = icmp sgt i8 %arg8, %arg8 + %V16I8 = icmp sgt <16 x i8> %argv16i8, %argv16i8 + %V32I8 = icmp sgt <32 x i8> %argv32i8, %argv32i8 + %I16 = icmp sgt i16 %arg16, %arg16 + %V8I16 = icmp sgt <8 x i16> %argv8i16, %argv8i16 + %V16I16 = icmp sgt <16 x i16> %argv16i16, %argv16i16 + %I32 = icmp sgt i32 %arg32, %arg32 + %V4I32 = icmp sgt <4 x i32> %argv4i32, %argv4i32 + %V8I32 = icmp sgt <8 x i32> %argv8i32, %argv8i32 + %I64 = icmp sgt i64 %arg64, %arg64 + %V2I64 = icmp sgt <2 x i64> %argv2i64, %argv2i64 + %V4I64 = icmp sgt <4 x i64> %argv4i64, %argv4i64 + ret i32 undef +} + +define i32 @cmp_int_ugt(i8 %arg8, <16 x i8> %argv16i8, <32 x i8> %argv32i8, i16 %arg16, <8 x i16> %argv8i16, <16 x i16> %argv16i16, i32 %arg32, <4 x i32> %argv4i32, <8 x i32> %argv8i32, i64 %arg64, <2 x i64> %argv2i64, <4 x i64> %argv4i64) { +; LSX-LABEL: 'cmp_int_ugt' +; LSX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp ugt i8 %arg8, %arg8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp ugt <16 x i8> %argv16i8, %argv16i8 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V32I8 = icmp ugt <32 x i8> %argv32i8, %argv32i8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp ugt i16 %arg16, %arg16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp ugt <8 x i16> %argv8i16, %argv8i16 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V16I16 = icmp ugt <16 x i16> %argv16i16, %argv16i16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp ugt i32 %arg32, %arg32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp ugt <4 x i32> %argv4i32, %argv4i32 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V8I32 = icmp ugt <8 x i32> %argv8i32, %argv8i32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp ugt i64 %arg64, %arg64 +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp ugt <2 x i64> %argv2i64, %argv2i64 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V4I64 = icmp ugt <4 x i64> %argv4i64, %argv4i64 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_int_ugt' +; LASX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp ugt i8 %arg8, %arg8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp ugt <16 x i8> %argv16i8, %argv16i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = icmp ugt <32 x i8> %argv32i8, %argv32i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp ugt i16 %arg16, %arg16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp ugt <8 x i16> %argv8i16, %argv8i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = icmp ugt <16 x i16> %argv16i16, %argv16i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp ugt i32 %arg32, %arg32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp ugt <4 x i32> %argv4i32, %argv4i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = icmp ugt <8 x i32> %argv8i32, %argv8i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp ugt i64 %arg64, %arg64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp ugt <2 x i64> %argv2i64, %argv2i64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = icmp ugt <4 x i64> %argv4i64, %argv4i64 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %I8 = icmp ugt i8 %arg8, %arg8 + %V16I8 = icmp ugt <16 x i8> %argv16i8, %argv16i8 + %V32I8 = icmp ugt <32 x i8> %argv32i8, %argv32i8 + %I16 = icmp ugt i16 %arg16, %arg16 + %V8I16 = icmp ugt <8 x i16> %argv8i16, %argv8i16 + %V16I16 = icmp ugt <16 x i16> %argv16i16, %argv16i16 + %I32 = icmp ugt i32 %arg32, %arg32 + %V4I32 = icmp ugt <4 x i32> %argv4i32, %argv4i32 + %V8I32 = icmp ugt <8 x i32> %argv8i32, %argv8i32 + %I64 = icmp ugt i64 %arg64, %arg64 + %V2I64 = icmp ugt <2 x i64> %argv2i64, %argv2i64 + %V4I64 = icmp ugt <4 x i64> %argv4i64, %argv4i64 + ret i32 undef +} + +define i32 @cmp_int_sle(i8 %arg8, <16 x i8> %argv16i8, <32 x i8> %argv32i8, i16 %arg16, <8 x i16> %argv8i16, <16 x i16> %argv16i16, i32 %arg32, <4 x i32> %argv4i32, <8 x i32> %argv8i32, i64 %arg64, <2 x i64> %argv2i64, <4 x i64> %argv4i64) { +; LSX-LABEL: 'cmp_int_sle' +; LSX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp sle i8 %arg8, %arg8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp sle <16 x i8> %argv16i8, %argv16i8 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V32I8 = icmp sle <32 x i8> %argv32i8, %argv32i8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp sle i16 %arg16, %arg16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp sle <8 x i16> %argv8i16, %argv8i16 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V16I16 = icmp sle <16 x i16> %argv16i16, %argv16i16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp sle i32 %arg32, %arg32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp sle <4 x i32> %argv4i32, %argv4i32 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V8I32 = icmp sle <8 x i32> %argv8i32, %argv8i32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp sle i64 %arg64, %arg64 +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp sle <2 x i64> %argv2i64, %argv2i64 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V4I64 = icmp sle <4 x i64> %argv4i64, %argv4i64 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_int_sle' +; LASX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp sle i8 %arg8, %arg8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp sle <16 x i8> %argv16i8, %argv16i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = icmp sle <32 x i8> %argv32i8, %argv32i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp sle i16 %arg16, %arg16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp sle <8 x i16> %argv8i16, %argv8i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = icmp sle <16 x i16> %argv16i16, %argv16i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp sle i32 %arg32, %arg32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp sle <4 x i32> %argv4i32, %argv4i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = icmp sle <8 x i32> %argv8i32, %argv8i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp sle i64 %arg64, %arg64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp sle <2 x i64> %argv2i64, %argv2i64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = icmp sle <4 x i64> %argv4i64, %argv4i64 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %I8 = icmp sle i8 %arg8, %arg8 + %V16I8 = icmp sle <16 x i8> %argv16i8, %argv16i8 + %V32I8 = icmp sle <32 x i8> %argv32i8, %argv32i8 + %I16 = icmp sle i16 %arg16, %arg16 + %V8I16 = icmp sle <8 x i16> %argv8i16, %argv8i16 + %V16I16 = icmp sle <16 x i16> %argv16i16, %argv16i16 + %I32 = icmp sle i32 %arg32, %arg32 + %V4I32 = icmp sle <4 x i32> %argv4i32, %argv4i32 + %V8I32 = icmp sle <8 x i32> %argv8i32, %argv8i32 + %I64 = icmp sle i64 %arg64, %arg64 + %V2I64 = icmp sle <2 x i64> %argv2i64, %argv2i64 + %V4I64 = icmp sle <4 x i64> %argv4i64, %argv4i64 + ret i32 undef +} + +define i32 @cmp_int_ule(i8 %arg8, <16 x i8> %argv16i8, <32 x i8> %argv32i8, i16 %arg16, <8 x i16> %argv8i16, <16 x i16> %argv16i16, i32 %arg32, <4 x i32> %argv4i32, <8 x i32> %argv8i32, i64 %arg64, <2 x i64> %argv2i64, <4 x i64> %argv4i64) { +; LSX-LABEL: 'cmp_int_ule' +; LSX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp ule i8 %arg8, %arg8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp ule <16 x i8> %argv16i8, %argv16i8 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V32I8 = icmp ule <32 x i8> %argv32i8, %argv32i8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp ule i16 %arg16, %arg16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp ule <8 x i16> %argv8i16, %argv8i16 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V16I16 = icmp ule <16 x i16> %argv16i16, %argv16i16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp ule i32 %arg32, %arg32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp ule <4 x i32> %argv4i32, %argv4i32 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V8I32 = icmp ule <8 x i32> %argv8i32, %argv8i32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp ule i64 %arg64, %arg64 +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp ule <2 x i64> %argv2i64, %argv2i64 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V4I64 = icmp ule <4 x i64> %argv4i64, %argv4i64 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_int_ule' +; LASX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp ule i8 %arg8, %arg8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp ule <16 x i8> %argv16i8, %argv16i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = icmp ule <32 x i8> %argv32i8, %argv32i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp ule i16 %arg16, %arg16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp ule <8 x i16> %argv8i16, %argv8i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = icmp ule <16 x i16> %argv16i16, %argv16i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp ule i32 %arg32, %arg32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp ule <4 x i32> %argv4i32, %argv4i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = icmp ule <8 x i32> %argv8i32, %argv8i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp ule i64 %arg64, %arg64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp ule <2 x i64> %argv2i64, %argv2i64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = icmp ule <4 x i64> %argv4i64, %argv4i64 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %I8 = icmp ule i8 %arg8, %arg8 + %V16I8 = icmp ule <16 x i8> %argv16i8, %argv16i8 + %V32I8 = icmp ule <32 x i8> %argv32i8, %argv32i8 + %I16 = icmp ule i16 %arg16, %arg16 + %V8I16 = icmp ule <8 x i16> %argv8i16, %argv8i16 + %V16I16 = icmp ule <16 x i16> %argv16i16, %argv16i16 + %I32 = icmp ule i32 %arg32, %arg32 + %V4I32 = icmp ule <4 x i32> %argv4i32, %argv4i32 + %V8I32 = icmp ule <8 x i32> %argv8i32, %argv8i32 + %I64 = icmp ule i64 %arg64, %arg64 + %V2I64 = icmp ule <2 x i64> %argv2i64, %argv2i64 + %V4I64 = icmp ule <4 x i64> %argv4i64, %argv4i64 + ret i32 undef +} + +define i32 @cmp_int_slt(i8 %arg8, <16 x i8> %argv16i8, <32 x i8> %argv32i8, i16 %arg16, <8 x i16> %argv8i16, <16 x i16> %argv16i16, i32 %arg32, <4 x i32> %argv4i32, <8 x i32> %argv8i32, i64 %arg64, <2 x i64> %argv2i64, <4 x i64> %argv4i64) { +; LSX-LABEL: 'cmp_int_slt' +; LSX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp slt i8 %arg8, %arg8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp slt <16 x i8> %argv16i8, %argv16i8 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V32I8 = icmp slt <32 x i8> %argv32i8, %argv32i8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp slt i16 %arg16, %arg16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp slt <8 x i16> %argv8i16, %argv8i16 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V16I16 = icmp slt <16 x i16> %argv16i16, %argv16i16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp slt i32 %arg32, %arg32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp slt <4 x i32> %argv4i32, %argv4i32 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V8I32 = icmp slt <8 x i32> %argv8i32, %argv8i32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp slt i64 %arg64, %arg64 +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp slt <2 x i64> %argv2i64, %argv2i64 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V4I64 = icmp slt <4 x i64> %argv4i64, %argv4i64 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_int_slt' +; LASX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp slt i8 %arg8, %arg8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp slt <16 x i8> %argv16i8, %argv16i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = icmp slt <32 x i8> %argv32i8, %argv32i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp slt i16 %arg16, %arg16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp slt <8 x i16> %argv8i16, %argv8i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = icmp slt <16 x i16> %argv16i16, %argv16i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp slt i32 %arg32, %arg32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp slt <4 x i32> %argv4i32, %argv4i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = icmp slt <8 x i32> %argv8i32, %argv8i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp slt i64 %arg64, %arg64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp slt <2 x i64> %argv2i64, %argv2i64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = icmp slt <4 x i64> %argv4i64, %argv4i64 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %I8 = icmp slt i8 %arg8, %arg8 + %V16I8 = icmp slt <16 x i8> %argv16i8, %argv16i8 + %V32I8 = icmp slt <32 x i8> %argv32i8, %argv32i8 + %I16 = icmp slt i16 %arg16, %arg16 + %V8I16 = icmp slt <8 x i16> %argv8i16, %argv8i16 + %V16I16 = icmp slt <16 x i16> %argv16i16, %argv16i16 + %I32 = icmp slt i32 %arg32, %arg32 + %V4I32 = icmp slt <4 x i32> %argv4i32, %argv4i32 + %V8I32 = icmp slt <8 x i32> %argv8i32, %argv8i32 + %I64 = icmp slt i64 %arg64, %arg64 + %V2I64 = icmp slt <2 x i64> %argv2i64, %argv2i64 + %V4I64 = icmp slt <4 x i64> %argv4i64, %argv4i64 + ret i32 undef +} + +define i32 @cmp_int_ult(i8 %arg8, <16 x i8> %argv16i8, <32 x i8> %argv32i8, i16 %arg16, <8 x i16> %argv8i16, <16 x i16> %argv16i16, i32 %arg32, <4 x i32> %argv4i32, <8 x i32> %argv8i32, i64 %arg64, <2 x i64> %argv2i64, <4 x i64> %argv4i64) { +; LSX-LABEL: 'cmp_int_ult' +; LSX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp ult i8 %arg8, %arg8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp ult <16 x i8> %argv16i8, %argv16i8 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V32I8 = icmp ult <32 x i8> %argv32i8, %argv32i8 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp ult i16 %arg16, %arg16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp ult <8 x i16> %argv8i16, %argv8i16 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V16I16 = icmp ult <16 x i16> %argv16i16, %argv16i16 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp ult i32 %arg32, %arg32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp ult <4 x i32> %argv4i32, %argv4i32 +; LSX-NEXT: Cost Model: Found costs of 2 for: %V8I32 = icmp ult <8 x i32> %argv8i32, %argv8i32 +; LSX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp ult i64 %arg64, %arg64 +; LSX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp ult <2 x i64> %argv2i64, %argv2i64 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:2 Lat:4 SizeLat:2 for: %V4I64 = icmp ult <4 x i64> %argv4i64, %argv4i64 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'cmp_int_ult' +; LASX-NEXT: Cost Model: Found costs of 1 for: %I8 = icmp ult i8 %arg8, %arg8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I8 = icmp ult <16 x i8> %argv16i8, %argv16i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V32I8 = icmp ult <32 x i8> %argv32i8, %argv32i8 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I16 = icmp ult i16 %arg16, %arg16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I16 = icmp ult <8 x i16> %argv8i16, %argv8i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V16I16 = icmp ult <16 x i16> %argv16i16, %argv16i16 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I32 = icmp ult i32 %arg32, %arg32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V4I32 = icmp ult <4 x i32> %argv4i32, %argv4i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %V8I32 = icmp ult <8 x i32> %argv8i32, %argv8i32 +; LASX-NEXT: Cost Model: Found costs of 1 for: %I64 = icmp ult i64 %arg64, %arg64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = icmp ult <2 x i64> %argv2i64, %argv2i64 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = icmp ult <4 x i64> %argv4i64, %argv4i64 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %I8 = icmp ult i8 %arg8, %arg8 + %V16I8 = icmp ult <16 x i8> %argv16i8, %argv16i8 + %V32I8 = icmp ult <32 x i8> %argv32i8, %argv32i8 + %I16 = icmp ult i16 %arg16, %arg16 + %V8I16 = icmp ult <8 x i16> %argv8i16, %argv8i16 + %V16I16 = icmp ult <16 x i16> %argv16i16, %argv16i16 + %I32 = icmp ult i32 %arg32, %arg32 + %V4I32 = icmp ult <4 x i32> %argv4i32, %argv4i32 + %V8I32 = icmp ult <8 x i32> %argv8i32, %argv8i32 + %I64 = icmp ult i64 %arg64, %arg64 + %V2I64 = icmp ult <2 x i64> %argv2i64, %argv2i64 + %V4I64 = icmp ult <4 x i64> %argv4i64, %argv4i64 + ret i32 undef +} diff --git a/llvm/test/Analysis/CostModel/LoongArch/load-store.ll b/llvm/test/Analysis/CostModel/LoongArch/load-store.ll new file mode 100644 index 0000000000000..b176d093fc5a7 --- /dev/null +++ b/llvm/test/Analysis/CostModel/LoongArch/load-store.ll @@ -0,0 +1,144 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6 + +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lsx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LSX +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lasx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LASX + +define i32 @store(i32 %arg) { +; LSX-LABEL: 'store' +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: store i8 poison, ptr poison, align 1 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: store i16 poison, ptr poison, align 2 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: store i32 poison, ptr poison, align 4 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: store i64 poison, ptr poison, align 8 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store float poison, ptr poison, align 4 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store double poison, ptr poison, align 8 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <16 x i8> poison, ptr poison, align 16 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <8 x i16> poison, ptr poison, align 16 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <4 x i32> poison, ptr poison, align 16 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <2 x i64> poison, ptr poison, align 16 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <4 x float> poison, ptr poison, align 16 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <2 x double> poison, ptr poison, align 16 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:10 SizeLat:2 for: store <32 x i8> poison, ptr poison, align 32 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:10 SizeLat:2 for: store <16 x i16> poison, ptr poison, align 32 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:10 SizeLat:2 for: store <8 x i32> poison, ptr poison, align 32 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:10 SizeLat:2 for: store <4 x i64> poison, ptr poison, align 32 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:10 SizeLat:2 for: store <8 x float> poison, ptr poison, align 32 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:10 SizeLat:2 for: store <4 x double> poison, ptr poison, align 32 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'store' +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: store i8 poison, ptr poison, align 1 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: store i16 poison, ptr poison, align 2 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: store i32 poison, ptr poison, align 4 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: store i64 poison, ptr poison, align 8 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store float poison, ptr poison, align 4 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store double poison, ptr poison, align 8 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <16 x i8> poison, ptr poison, align 16 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <8 x i16> poison, ptr poison, align 16 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <4 x i32> poison, ptr poison, align 16 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <2 x i64> poison, ptr poison, align 16 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <4 x float> poison, ptr poison, align 16 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <2 x double> poison, ptr poison, align 16 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <32 x i8> poison, ptr poison, align 32 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <16 x i16> poison, ptr poison, align 32 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <8 x i32> poison, ptr poison, align 32 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <4 x i64> poison, ptr poison, align 32 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <8 x float> poison, ptr poison, align 32 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: store <4 x double> poison, ptr poison, align 32 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + store i8 poison, ptr poison + store i16 poison, ptr poison + store i32 poison, ptr poison + store i64 poison, ptr poison + + store float poison, ptr poison + store double poison, ptr poison + + store <16 x i8> poison, ptr poison + store <8 x i16> poison, ptr poison + store <4 x i32> poison, ptr poison + store <2 x i64> poison, ptr poison + + store <4 x float> poison, ptr poison + store <2 x double> poison, ptr poison + + store <32 x i8> poison, ptr poison + store <16 x i16> poison, ptr poison + store <8 x i32> poison, ptr poison + store <4 x i64> poison, ptr poison + + store <8 x float> poison, ptr poison + store <4 x double> poison, ptr poison + + ret i32 poison +} + +define i32 @load(i32 %arg) { +; LSX-LABEL: 'load' +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %1 = load i8, ptr poison, align 1 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %2 = load i16, ptr poison, align 2 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %3 = load i32, ptr poison, align 4 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %4 = load i64, ptr poison, align 8 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %5 = load float, ptr poison, align 4 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %6 = load double, ptr poison, align 8 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %7 = load <16 x i8>, ptr poison, align 16 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %8 = load <8 x i16>, ptr poison, align 16 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %9 = load <4 x i32>, ptr poison, align 16 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %10 = load <2 x i64>, ptr poison, align 16 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %11 = load <4 x float>, ptr poison, align 16 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %12 = load <2 x double>, ptr poison, align 16 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:10 SizeLat:2 for: %13 = load <32 x i8>, ptr poison, align 32 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:10 SizeLat:2 for: %14 = load <16 x i16>, ptr poison, align 32 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:10 SizeLat:2 for: %15 = load <8 x i32>, ptr poison, align 32 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:10 SizeLat:2 for: %16 = load <4 x i64>, ptr poison, align 32 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:10 SizeLat:2 for: %17 = load <8 x float>, ptr poison, align 32 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:10 SizeLat:2 for: %18 = load <4 x double>, ptr poison, align 32 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'load' +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %1 = load i8, ptr poison, align 1 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %2 = load i16, ptr poison, align 2 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %3 = load i32, ptr poison, align 4 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:4 SizeLat:1 for: %4 = load i64, ptr poison, align 8 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %5 = load float, ptr poison, align 4 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %6 = load double, ptr poison, align 8 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %7 = load <16 x i8>, ptr poison, align 16 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %8 = load <8 x i16>, ptr poison, align 16 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %9 = load <4 x i32>, ptr poison, align 16 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %10 = load <2 x i64>, ptr poison, align 16 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %11 = load <4 x float>, ptr poison, align 16 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %12 = load <2 x double>, ptr poison, align 16 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %13 = load <32 x i8>, ptr poison, align 32 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %14 = load <16 x i16>, ptr poison, align 32 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %15 = load <8 x i32>, ptr poison, align 32 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %16 = load <4 x i64>, ptr poison, align 32 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %17 = load <8 x float>, ptr poison, align 32 +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:5 SizeLat:1 for: %18 = load <4 x double>, ptr poison, align 32 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + load i8, ptr poison + load i16, ptr poison + load i32, ptr poison + load i64, ptr poison + + load float, ptr poison + load double, ptr poison + + load <16 x i8>, ptr poison + load <8 x i16>, ptr poison + load <4 x i32>, ptr poison + load <2 x i64>, ptr poison + + load <4 x float>, ptr poison + load <2 x double>, ptr poison + + load <32 x i8>, ptr poison + load <16 x i16>, ptr poison + load <8 x i32>, ptr poison + load <4 x i64>, ptr poison + + load <8 x float>, ptr poison + load <4 x double>, ptr poison + + ret i32 poison +} diff --git a/llvm/test/Analysis/CostModel/LoongArch/select.ll b/llvm/test/Analysis/CostModel/LoongArch/select.ll new file mode 100644 index 0000000000000..9fbe417ee9bd4 --- /dev/null +++ b/llvm/test/Analysis/CostModel/LoongArch/select.ll @@ -0,0 +1,83 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6 +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lsx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LSX +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lasx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LASX + +define i32 @test_select() { +; LSX-LABEL: 'test_select' +; LSX-NEXT: Cost Model: Found costs of 1 for: %I64 = select i1 undef, i64 undef, i64 undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = select <2 x i1> undef, <2 x i64> undef, <2 x i64> undef +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:4 SizeLat:2 for: %V4I64 = select <4 x i1> undef, <4 x i64> undef, <4 x i64> undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %I32 = select i1 undef, i32 undef, i32 undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:1 SizeLat:1 for: %V4I32 = select <4 x i1> undef, <4 x i32> undef, <4 x i32> undef +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:2 SizeLat:2 for: %V8I32 = select <8 x i1> undef, <8 x i32> undef, <8 x i32> undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %I16 = select i1 undef, i16 undef, i16 undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:1 SizeLat:1 for: %V8I16 = select <8 x i1> undef, <8 x i16> undef, <8 x i16> undef +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:2 SizeLat:2 for: %V16I16 = select <16 x i1> undef, <16 x i16> undef, <16 x i16> undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %I8 = select i1 undef, i8 undef, i8 undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:1 SizeLat:1 for: %V16I8 = select <16 x i1> undef, <16 x i8> undef, <16 x i8> undef +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:2 SizeLat:2 for: %V32I8 = select <32 x i1> undef, <32 x i8> undef, <32 x i8> undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'test_select' +; LASX-NEXT: Cost Model: Found costs of 1 for: %I64 = select i1 undef, i64 undef, i64 undef +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V2I64 = select <2 x i1> undef, <2 x i64> undef, <2 x i64> undef +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V4I64 = select <4 x i1> undef, <4 x i64> undef, <4 x i64> undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %I32 = select i1 undef, i32 undef, i32 undef +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:1 SizeLat:1 for: %V4I32 = select <4 x i1> undef, <4 x i32> undef, <4 x i32> undef +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:1 SizeLat:1 for: %V8I32 = select <8 x i1> undef, <8 x i32> undef, <8 x i32> undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %I16 = select i1 undef, i16 undef, i16 undef +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:1 SizeLat:1 for: %V8I16 = select <8 x i1> undef, <8 x i16> undef, <8 x i16> undef +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:1 SizeLat:1 for: %V16I16 = select <16 x i1> undef, <16 x i16> undef, <16 x i16> undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %I8 = select i1 undef, i8 undef, i8 undef +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:1 SizeLat:1 for: %V16I8 = select <16 x i1> undef, <16 x i8> undef, <16 x i8> undef +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:1 SizeLat:1 for: %V32I8 = select <32 x i1> undef, <32 x i8> undef, <32 x i8> undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %I64 = select i1 undef, i64 undef, i64 undef + %V2I64 = select <2 x i1> undef, <2 x i64> undef, <2 x i64> undef + %V4I64 = select <4 x i1> undef, <4 x i64> undef, <4 x i64> undef + + %I32 = select i1 undef, i32 undef, i32 undef + %V4I32 = select <4 x i1> undef, <4 x i32> undef, <4 x i32> undef + %V8I32 = select <8 x i1> undef, <8 x i32> undef, <8 x i32> undef + + %I16 = select i1 undef, i16 undef, i16 undef + %V8I16 = select <8 x i1> undef, <8 x i16> undef, <8 x i16> undef + %V16I16 = select <16 x i1> undef, <16 x i16> undef, <16 x i16> undef + + %I8 = select i1 undef, i8 undef, i8 undef + %V16I8 = select <16 x i1> undef, <16 x i8> undef, <16 x i8> undef + %V32I8 = select <32 x i1> undef, <32 x i8> undef, <32 x i8> undef + + ret i32 undef +} + +define i32 @test_select_fp() { +; LSX-LABEL: 'test_select_fp' +; LSX-NEXT: Cost Model: Found costs of 1 for: %F64 = select i1 undef, double undef, double undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V2F64 = select <2 x i1> undef, <2 x double> undef, <2 x double> undef +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:4 SizeLat:2 for: %V4F64 = select <4 x i1> undef, <4 x double> undef, <4 x double> undef +; LSX-NEXT: Cost Model: Found costs of 1 for: %F32 = select i1 undef, float undef, float undef +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:1 SizeLat:1 for: %V4F32 = select <4 x i1> undef, <4 x float> undef, <4 x float> undef +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:2 Lat:2 SizeLat:2 for: %V8F32 = select <8 x i1> undef, <8 x float> undef, <8 x float> undef +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; +; LASX-LABEL: 'test_select_fp' +; LASX-NEXT: Cost Model: Found costs of 1 for: %F64 = select i1 undef, double undef, double undef +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V2F64 = select <2 x i1> undef, <2 x double> undef, <2 x double> undef +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %V4F64 = select <4 x i1> undef, <4 x double> undef, <4 x double> undef +; LASX-NEXT: Cost Model: Found costs of 1 for: %F32 = select i1 undef, float undef, float undef +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:1 SizeLat:1 for: %V4F32 = select <4 x i1> undef, <4 x float> undef, <4 x float> undef +; LASX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:1 SizeLat:1 for: %V8F32 = select <8 x i1> undef, <8 x float> undef, <8 x float> undef +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 undef +; + %F64 = select i1 undef, double undef, double undef + %V2F64 = select <2 x i1> undef, <2 x double> undef, <2 x double> undef + %V4F64 = select <4 x i1> undef, <4 x double> undef, <4 x double> undef + + %F32 = select i1 undef, float undef, float undef + %V4F32 = select <4 x i1> undef, <4 x float> undef, <4 x float> undef + %V8F32 = select <8 x i1> undef, <8 x float> undef, <8 x float> undef + + ret i32 undef +} diff --git a/llvm/test/Analysis/CostModel/LoongArch/vector-extract.ll b/llvm/test/Analysis/CostModel/LoongArch/vector-extract.ll new file mode 100644 index 0000000000000..f184f5b155842 --- /dev/null +++ b/llvm/test/Analysis/CostModel/LoongArch/vector-extract.ll @@ -0,0 +1,378 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6 + +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lsx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LSX +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lasx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LASX + +define i32 @extract_double(i32 %arg) { +; LSX-LABEL: 'extract_double' +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2f64_a = extractelement <2 x double> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2f64_0 = extractelement <2 x double> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2f64_1 = extractelement <2 x double> poison, i32 1 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4f64_a = extractelement <4 x double> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %v4f64_0 = extractelement <4 x double> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %v4f64_3 = extractelement <4 x double> poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'extract_double' +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2f64_a = extractelement <2 x double> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2f64_0 = extractelement <2 x double> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2f64_1 = extractelement <2 x double> poison, i32 1 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4f64_a = extractelement <4 x double> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %v4f64_0 = extractelement <4 x double> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %v4f64_3 = extractelement <4 x double> poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %v2f64_a = extractelement <2 x double> poison, i32 %arg + %v2f64_0 = extractelement <2 x double> poison, i32 0 + %v2f64_1 = extractelement <2 x double> poison, i32 1 + + %v4f64_a = extractelement <4 x double> poison, i32 %arg + %v4f64_0 = extractelement <4 x double> poison, i32 0 + %v4f64_3 = extractelement <4 x double> poison, i32 3 + + ret i32 poison +} + +define i32 @extract_float(i32 %arg) { +; LSX-LABEL: 'extract_float' +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2f32_a = extractelement <2 x float> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2f32_0 = extractelement <2 x float> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2f32_1 = extractelement <2 x float> poison, i32 1 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4f32_a = extractelement <4 x float> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4f32_0 = extractelement <4 x float> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4f32_3 = extractelement <4 x float> poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v8f32_a = extractelement <8 x float> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %v8f32_0 = extractelement <8 x float> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %v8f32_3 = extractelement <8 x float> poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %v8f32_4 = extractelement <8 x float> poison, i32 4 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %v8f32_7 = extractelement <8 x float> poison, i32 7 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'extract_float' +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2f32_a = extractelement <2 x float> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2f32_0 = extractelement <2 x float> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2f32_1 = extractelement <2 x float> poison, i32 1 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4f32_a = extractelement <4 x float> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4f32_0 = extractelement <4 x float> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4f32_3 = extractelement <4 x float> poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v8f32_a = extractelement <8 x float> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %v8f32_0 = extractelement <8 x float> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %v8f32_3 = extractelement <8 x float> poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %v8f32_4 = extractelement <8 x float> poison, i32 4 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:2 SizeLat:1 for: %v8f32_7 = extractelement <8 x float> poison, i32 7 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %v2f32_a = extractelement <2 x float> poison, i32 %arg + %v2f32_0 = extractelement <2 x float> poison, i32 0 + %v2f32_1 = extractelement <2 x float> poison, i32 1 + + %v4f32_a = extractelement <4 x float> poison, i32 %arg + %v4f32_0 = extractelement <4 x float> poison, i32 0 + %v4f32_3 = extractelement <4 x float> poison, i32 3 + + %v8f32_a = extractelement <8 x float> poison, i32 %arg + %v8f32_0 = extractelement <8 x float> poison, i32 0 + %v8f32_3 = extractelement <8 x float> poison, i32 3 + %v8f32_4 = extractelement <8 x float> poison, i32 4 + %v8f32_7 = extractelement <8 x float> poison, i32 7 + + ret i32 poison +} + +define i32 @extract_i64(i32 %arg) { +; LSX-LABEL: 'extract_i64' +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2i64_a = extractelement <2 x i64> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i64_0 = extractelement <2 x i64> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i64_1 = extractelement <2 x i64> poison, i32 1 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4i64_a = extractelement <4 x i64> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v4i64_0 = extractelement <4 x i64> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v4i64_3 = extractelement <4 x i64> poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'extract_i64' +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2i64_a = extractelement <2 x i64> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i64_0 = extractelement <2 x i64> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i64_1 = extractelement <2 x i64> poison, i32 1 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4i64_a = extractelement <4 x i64> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:5 SizeLat:1 for: %v4i64_0 = extractelement <4 x i64> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:5 CodeSize:2 Lat:6 SizeLat:2 for: %v4i64_3 = extractelement <4 x i64> poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %v2i64_a = extractelement <2 x i64> poison, i32 %arg + %v2i64_0 = extractelement <2 x i64> poison, i32 0 + %v2i64_1 = extractelement <2 x i64> poison, i32 1 + + %v4i64_a = extractelement <4 x i64> poison, i32 %arg + %v4i64_0 = extractelement <4 x i64> poison, i32 0 + %v4i64_3 = extractelement <4 x i64> poison, i32 3 + + ret i32 poison +} + +define i32 @extract_i32(i32 %arg) { +; LSX-LABEL: 'extract_i32' +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2i32_a = extractelement <2 x i32> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i32_0 = extractelement <2 x i32> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i32_1 = extractelement <2 x i32> poison, i32 1 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4i32_a = extractelement <4 x i32> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i32_0 = extractelement <4 x i32> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i32_3 = extractelement <4 x i32> poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v8i32_a = extractelement <8 x i32> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v8i32_0 = extractelement <8 x i32> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v8i32_3 = extractelement <8 x i32> poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v8i32_4 = extractelement <8 x i32> poison, i32 4 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v8i32_7 = extractelement <8 x i32> poison, i32 7 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v16i32_a = extractelement <16 x i32> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:16 CodeSize:1 Lat:12 SizeLat:1 for: %v16i32_0 = extractelement <16 x i32> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:16 CodeSize:1 Lat:12 SizeLat:1 for: %v16i32_3 = extractelement <16 x i32> poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of RThru:16 CodeSize:1 Lat:12 SizeLat:1 for: %v16i32_8 = extractelement <16 x i32> poison, i32 8 +; LSX-NEXT: Cost Model: Found costs of RThru:16 CodeSize:1 Lat:12 SizeLat:1 for: %v16i32_15 = extractelement <16 x i32> poison, i32 15 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'extract_i32' +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2i32_a = extractelement <2 x i32> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i32_0 = extractelement <2 x i32> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i32_1 = extractelement <2 x i32> poison, i32 1 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4i32_a = extractelement <4 x i32> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i32_0 = extractelement <4 x i32> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i32_3 = extractelement <4 x i32> poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v8i32_a = extractelement <8 x i32> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:5 SizeLat:1 for: %v8i32_0 = extractelement <8 x i32> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:5 SizeLat:1 for: %v8i32_3 = extractelement <8 x i32> poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of RThru:5 CodeSize:2 Lat:6 SizeLat:2 for: %v8i32_4 = extractelement <8 x i32> poison, i32 4 +; LASX-NEXT: Cost Model: Found costs of RThru:5 CodeSize:2 Lat:6 SizeLat:2 for: %v8i32_7 = extractelement <8 x i32> poison, i32 7 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v16i32_a = extractelement <16 x i32> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:10 SizeLat:1 for: %v16i32_0 = extractelement <16 x i32> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:10 SizeLat:1 for: %v16i32_3 = extractelement <16 x i32> poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:10 SizeLat:1 for: %v16i32_8 = extractelement <16 x i32> poison, i32 8 +; LASX-NEXT: Cost Model: Found costs of RThru:9 CodeSize:2 Lat:11 SizeLat:2 for: %v16i32_15 = extractelement <16 x i32> poison, i32 15 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %v2i32_a = extractelement <2 x i32> poison, i32 %arg + %v2i32_0 = extractelement <2 x i32> poison, i32 0 + %v2i32_1 = extractelement <2 x i32> poison, i32 1 + + %v4i32_a = extractelement <4 x i32> poison, i32 %arg + %v4i32_0 = extractelement <4 x i32> poison, i32 0 + %v4i32_3 = extractelement <4 x i32> poison, i32 3 + + %v8i32_a = extractelement <8 x i32> poison, i32 %arg + %v8i32_0 = extractelement <8 x i32> poison, i32 0 + %v8i32_3 = extractelement <8 x i32> poison, i32 3 + %v8i32_4 = extractelement <8 x i32> poison, i32 4 + %v8i32_7 = extractelement <8 x i32> poison, i32 7 + + %v16i32_a = extractelement <16 x i32> poison, i32 %arg + %v16i32_0 = extractelement <16 x i32> poison, i32 0 + %v16i32_3 = extractelement <16 x i32> poison, i32 3 + %v16i32_8 = extractelement <16 x i32> poison, i32 8 + %v16i32_15 = extractelement <16 x i32> poison, i32 15 + + ret i32 poison +} + +define i32 @extract_i16(i32 %arg) { +; LSX-LABEL: 'extract_i16' +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2i16_a = extractelement <2 x i16> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i16_0 = extractelement <2 x i16> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i16_1 = extractelement <2 x i16> poison, i32 1 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4i16_a = extractelement <4 x i16> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i16_0 = extractelement <4 x i16> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i16_3 = extractelement <4 x i16> poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v8i16_a = extractelement <8 x i16> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i16_0 = extractelement <8 x i16> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i16_7 = extractelement <8 x i16> poison, i32 7 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v16i16_a = extractelement <16 x i16> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v16i16_0 = extractelement <16 x i16> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v16i16_7 = extractelement <16 x i16> poison, i32 7 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v16i16_8 = extractelement <16 x i16> poison, i32 8 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v16i16_15 = extractelement <16 x i16> poison, i32 15 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'extract_i16' +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2i16_a = extractelement <2 x i16> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i16_0 = extractelement <2 x i16> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i16_1 = extractelement <2 x i16> poison, i32 1 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4i16_a = extractelement <4 x i16> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i16_0 = extractelement <4 x i16> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i16_3 = extractelement <4 x i16> poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v8i16_a = extractelement <8 x i16> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i16_0 = extractelement <8 x i16> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i16_7 = extractelement <8 x i16> poison, i32 7 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v16i16_a = extractelement <16 x i16> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i16_0 = extractelement <16 x i16> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i16_7 = extractelement <16 x i16> poison, i32 7 +; LASX-NEXT: Cost Model: Found costs of RThru:5 CodeSize:2 Lat:4 SizeLat:2 for: %v16i16_8 = extractelement <16 x i16> poison, i32 8 +; LASX-NEXT: Cost Model: Found costs of RThru:5 CodeSize:2 Lat:4 SizeLat:2 for: %v16i16_15 = extractelement <16 x i16> poison, i32 15 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %v2i16_a = extractelement <2 x i16> poison, i32 %arg + %v2i16_0 = extractelement <2 x i16> poison, i32 0 + %v2i16_1 = extractelement <2 x i16> poison, i32 1 + + %v4i16_a = extractelement <4 x i16> poison, i32 %arg + %v4i16_0 = extractelement <4 x i16> poison, i32 0 + %v4i16_3 = extractelement <4 x i16> poison, i32 3 + + %v8i16_a = extractelement <8 x i16> poison, i32 %arg + %v8i16_0 = extractelement <8 x i16> poison, i32 0 + %v8i16_7 = extractelement <8 x i16> poison, i32 7 + + %v16i16_a = extractelement <16 x i16> poison, i32 %arg + %v16i16_0 = extractelement <16 x i16> poison, i32 0 + %v16i16_7 = extractelement <16 x i16> poison, i32 7 + %v16i16_8 = extractelement <16 x i16> poison, i32 8 + %v16i16_15 = extractelement <16 x i16> poison, i32 15 + + ret i32 poison +} + +define i32 @extract_i8(i32 %arg) { +; LSX-LABEL: 'extract_i8' +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2i8_a = extractelement <2 x i8> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i8_0 = extractelement <2 x i8> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i8_1 = extractelement <2 x i8> poison, i32 1 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4i8_a = extractelement <4 x i8> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i8_0 = extractelement <4 x i8> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i8_3 = extractelement <4 x i8> poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v8i8_a = extractelement <8 x i8> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i8_0 = extractelement <8 x i8> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i8_7 = extractelement <8 x i8> poison, i32 7 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v16i8_a = extractelement <16 x i8> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i8_0 = extractelement <16 x i8> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i8_8 = extractelement <16 x i8> poison, i32 8 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i8_15 = extractelement <16 x i8> poison, i32 15 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v32i8_a = extractelement <32 x i8> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i8_0 = extractelement <32 x i8> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i8_7 = extractelement <32 x i8> poison, i32 7 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i8_8 = extractelement <32 x i8> poison, i32 8 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i8_15 = extractelement <32 x i8> poison, i32 15 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i8_24 = extractelement <32 x i8> poison, i32 24 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i8_31 = extractelement <32 x i8> poison, i32 31 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'extract_i8' +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2i8_a = extractelement <2 x i8> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i8_0 = extractelement <2 x i8> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i8_1 = extractelement <2 x i8> poison, i32 1 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4i8_a = extractelement <4 x i8> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i8_0 = extractelement <4 x i8> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i8_3 = extractelement <4 x i8> poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v8i8_a = extractelement <8 x i8> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i8_0 = extractelement <8 x i8> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i8_7 = extractelement <8 x i8> poison, i32 7 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v16i8_a = extractelement <16 x i8> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i8_0 = extractelement <16 x i8> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i8_8 = extractelement <16 x i8> poison, i32 8 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i8_15 = extractelement <16 x i8> poison, i32 15 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v32i8_a = extractelement <32 x i8> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i8_0 = extractelement <32 x i8> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i8_7 = extractelement <32 x i8> poison, i32 7 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i8_8 = extractelement <32 x i8> poison, i32 8 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i8_15 = extractelement <32 x i8> poison, i32 15 +; LASX-NEXT: Cost Model: Found costs of RThru:5 CodeSize:2 Lat:4 SizeLat:2 for: %v32i8_24 = extractelement <32 x i8> poison, i32 24 +; LASX-NEXT: Cost Model: Found costs of RThru:5 CodeSize:2 Lat:4 SizeLat:2 for: %v32i8_31 = extractelement <32 x i8> poison, i32 31 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %v2i8_a = extractelement <2 x i8> poison, i32 %arg + %v2i8_0 = extractelement <2 x i8> poison, i32 0 + %v2i8_1 = extractelement <2 x i8> poison, i32 1 + + %v4i8_a = extractelement <4 x i8> poison, i32 %arg + %v4i8_0 = extractelement <4 x i8> poison, i32 0 + %v4i8_3 = extractelement <4 x i8> poison, i32 3 + + %v8i8_a = extractelement <8 x i8> poison, i32 %arg + %v8i8_0 = extractelement <8 x i8> poison, i32 0 + %v8i8_7 = extractelement <8 x i8> poison, i32 7 + + %v16i8_a = extractelement <16 x i8> poison, i32 %arg + %v16i8_0 = extractelement <16 x i8> poison, i32 0 + %v16i8_8 = extractelement <16 x i8> poison, i32 8 + %v16i8_15 = extractelement <16 x i8> poison, i32 15 + + %v32i8_a = extractelement <32 x i8> poison, i32 %arg + %v32i8_0 = extractelement <32 x i8> poison, i32 0 + %v32i8_7 = extractelement <32 x i8> poison, i32 7 + %v32i8_8 = extractelement <32 x i8> poison, i32 8 + %v32i8_15 = extractelement <32 x i8> poison, i32 15 + %v32i8_24 = extractelement <32 x i8> poison, i32 24 + %v32i8_31 = extractelement <32 x i8> poison, i32 31 + + ret i32 poison +} + +define i32 @extract_i1(i32 %arg) { +; LSX-LABEL: 'extract_i1' +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2i1_a = extractelement <2 x i1> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i1_0 = extractelement <2 x i1> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i1_1 = extractelement <2 x i1> poison, i32 1 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4i1_a = extractelement <4 x i1> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i1_0 = extractelement <4 x i1> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i1_2 = extractelement <4 x i1> poison, i32 2 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v8i1_a = extractelement <8 x i1> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i1_0 = extractelement <8 x i1> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i1_4 = extractelement <8 x i1> poison, i32 4 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v16i1_a = extractelement <16 x i1> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i1_0 = extractelement <16 x i1> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i1_8 = extractelement <16 x i1> poison, i32 8 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i1_15 = extractelement <16 x i1> poison, i32 15 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v32i1_a = extractelement <32 x i1> poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i1_0 = extractelement <32 x i1> poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i1_7 = extractelement <32 x i1> poison, i32 7 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i1_8 = extractelement <32 x i1> poison, i32 8 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i1_15 = extractelement <32 x i1> poison, i32 15 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i1_24 = extractelement <32 x i1> poison, i32 24 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i1_31 = extractelement <32 x i1> poison, i32 31 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'extract_i1' +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2i1_a = extractelement <2 x i1> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i1_0 = extractelement <2 x i1> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i1_1 = extractelement <2 x i1> poison, i32 1 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4i1_a = extractelement <4 x i1> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i1_0 = extractelement <4 x i1> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i1_2 = extractelement <4 x i1> poison, i32 2 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v8i1_a = extractelement <8 x i1> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i1_0 = extractelement <8 x i1> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i1_4 = extractelement <8 x i1> poison, i32 4 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v16i1_a = extractelement <16 x i1> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i1_0 = extractelement <16 x i1> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i1_8 = extractelement <16 x i1> poison, i32 8 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i1_15 = extractelement <16 x i1> poison, i32 15 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v32i1_a = extractelement <32 x i1> poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i1_0 = extractelement <32 x i1> poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i1_7 = extractelement <32 x i1> poison, i32 7 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i1_8 = extractelement <32 x i1> poison, i32 8 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i1_15 = extractelement <32 x i1> poison, i32 15 +; LASX-NEXT: Cost Model: Found costs of RThru:5 CodeSize:2 Lat:4 SizeLat:2 for: %v32i1_24 = extractelement <32 x i1> poison, i32 24 +; LASX-NEXT: Cost Model: Found costs of RThru:5 CodeSize:2 Lat:4 SizeLat:2 for: %v32i1_31 = extractelement <32 x i1> poison, i32 31 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %v2i1_a = extractelement <2 x i1> poison, i32 %arg + %v2i1_0 = extractelement <2 x i1> poison, i32 0 + %v2i1_1 = extractelement <2 x i1> poison, i32 1 + + %v4i1_a = extractelement <4 x i1> poison, i32 %arg + %v4i1_0 = extractelement <4 x i1> poison, i32 0 + %v4i1_2 = extractelement <4 x i1> poison, i32 2 + + %v8i1_a = extractelement <8 x i1> poison, i32 %arg + %v8i1_0 = extractelement <8 x i1> poison, i32 0 + %v8i1_4 = extractelement <8 x i1> poison, i32 4 + + %v16i1_a = extractelement <16 x i1> poison, i32 %arg + %v16i1_0 = extractelement <16 x i1> poison, i32 0 + %v16i1_8 = extractelement <16 x i1> poison, i32 8 + %v16i1_15 = extractelement <16 x i1> poison, i32 15 + + %v32i1_a = extractelement <32 x i1> poison, i32 %arg + %v32i1_0 = extractelement <32 x i1> poison, i32 0 + %v32i1_7 = extractelement <32 x i1> poison, i32 7 + %v32i1_8 = extractelement <32 x i1> poison, i32 8 + %v32i1_15 = extractelement <32 x i1> poison, i32 15 + %v32i1_24 = extractelement <32 x i1> poison, i32 24 + %v32i1_31 = extractelement <32 x i1> poison, i32 31 + + ret i32 poison +} diff --git a/llvm/test/Analysis/CostModel/LoongArch/vector-insert.ll b/llvm/test/Analysis/CostModel/LoongArch/vector-insert.ll new file mode 100644 index 0000000000000..c91a946739ba8 --- /dev/null +++ b/llvm/test/Analysis/CostModel/LoongArch/vector-insert.ll @@ -0,0 +1,362 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 6 + +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lsx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LSX +; RUN: opt < %s -passes="print" -cost-kind=all -mtriple=loongarch64 -mattr=+lasx 2>&1 -disable-output < %s | FileCheck %s --check-prefixes=LASX + +define i32 @insert_double(i32 %arg) { +; LSX-LABEL: 'insert_double' +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2f64_a = insertelement <2 x double> poison, double poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2f64_0 = insertelement <2 x double> poison, double poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2f64_1 = insertelement <2 x double> poison, double poison, i32 1 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4f64_a = insertelement <4 x double> poison, double poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %v4f64_0 = insertelement <4 x double> poison, double poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %v4f64_3 = insertelement <4 x double> poison, double poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'insert_double' +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2f64_a = insertelement <2 x double> poison, double poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2f64_0 = insertelement <2 x double> poison, double poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2f64_1 = insertelement <2 x double> poison, double poison, i32 1 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4f64_a = insertelement <4 x double> poison, double poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %v4f64_0 = insertelement <4 x double> poison, double poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %v4f64_3 = insertelement <4 x double> poison, double poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %v2f64_a = insertelement <2 x double> poison, double poison, i32 %arg + %v2f64_0 = insertelement <2 x double> poison, double poison, i32 0 + %v2f64_1 = insertelement <2 x double> poison, double poison, i32 1 + + %v4f64_a = insertelement <4 x double> poison, double poison, i32 %arg + %v4f64_0 = insertelement <4 x double> poison, double poison, i32 0 + %v4f64_3 = insertelement <4 x double> poison, double poison, i32 3 + + ret i32 poison +} + +define i32 @insert_float(i32 %arg) { +; LSX-LABEL: 'insert_float' +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2f32_a = insertelement <2 x float> poison, float poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2f32_0 = insertelement <2 x float> poison, float poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2f32_1 = insertelement <2 x float> poison, float poison, i32 1 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4f32_a = insertelement <4 x float> poison, float poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4f32_0 = insertelement <4 x float> poison, float poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4f32_3 = insertelement <4 x float> poison, float poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v8f32_a = insertelement <8 x float> poison, float poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %v8f32_0 = insertelement <8 x float> poison, float poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %v8f32_3 = insertelement <8 x float> poison, float poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %v8f32_4 = insertelement <8 x float> poison, float poison, i32 4 +; LSX-NEXT: Cost Model: Found costs of RThru:2 CodeSize:1 Lat:2 SizeLat:1 for: %v8f32_7 = insertelement <8 x float> poison, float poison, i32 7 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'insert_float' +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2f32_a = insertelement <2 x float> poison, float poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2f32_0 = insertelement <2 x float> poison, float poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2f32_1 = insertelement <2 x float> poison, float poison, i32 1 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4f32_a = insertelement <4 x float> poison, float poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4f32_0 = insertelement <4 x float> poison, float poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4f32_3 = insertelement <4 x float> poison, float poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v8f32_a = insertelement <8 x float> poison, float poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %v8f32_0 = insertelement <8 x float> poison, float poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %v8f32_3 = insertelement <8 x float> poison, float poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %v8f32_4 = insertelement <8 x float> poison, float poison, i32 4 +; LASX-NEXT: Cost Model: Found costs of RThru:1 CodeSize:1 Lat:3 SizeLat:1 for: %v8f32_7 = insertelement <8 x float> poison, float poison, i32 7 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %v2f32_a = insertelement <2 x float> poison, float poison, i32 %arg + %v2f32_0 = insertelement <2 x float> poison, float poison, i32 0 + %v2f32_1 = insertelement <2 x float> poison, float poison, i32 1 + + %v4f32_a = insertelement <4 x float> poison, float poison, i32 %arg + %v4f32_0 = insertelement <4 x float> poison, float poison, i32 0 + %v4f32_3 = insertelement <4 x float> poison, float poison, i32 3 + + %v8f32_a = insertelement <8 x float> poison, float poison, i32 %arg + %v8f32_0 = insertelement <8 x float> poison, float poison, i32 0 + %v8f32_3 = insertelement <8 x float> poison, float poison, i32 3 + %v8f32_4 = insertelement <8 x float> poison, float poison, i32 4 + %v8f32_7 = insertelement <8 x float> poison, float poison, i32 7 + + ret i32 poison +} + +define i32 @insert_i64(i32 %arg) { +; LSX-LABEL: 'insert_i64' +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2i64_a = insertelement <2 x i64> poison, i64 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i64_0 = insertelement <2 x i64> poison, i64 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i64_1 = insertelement <2 x i64> poison, i64 poison, i32 1 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4i64_a = insertelement <4 x i64> poison, i64 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v4i64_0 = insertelement <4 x i64> poison, i64 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v4i64_3 = insertelement <4 x i64> poison, i64 poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'insert_i64' +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2i64_a = insertelement <2 x i64> poison, i64 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i64_0 = insertelement <2 x i64> poison, i64 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i64_1 = insertelement <2 x i64> poison, i64 poison, i32 1 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4i64_a = insertelement <4 x i64> poison, i64 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:4 SizeLat:1 for: %v4i64_0 = insertelement <4 x i64> poison, i64 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:6 CodeSize:3 Lat:6 SizeLat:3 for: %v4i64_3 = insertelement <4 x i64> poison, i64 poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %v2i64_a = insertelement <2 x i64> poison, i64 poison, i32 %arg + %v2i64_0 = insertelement <2 x i64> poison, i64 poison, i32 0 + %v2i64_1 = insertelement <2 x i64> poison, i64 poison, i32 1 + + %v4i64_a = insertelement <4 x i64> poison, i64 poison, i32 %arg + %v4i64_0 = insertelement <4 x i64> poison, i64 poison, i32 0 + %v4i64_3 = insertelement <4 x i64> poison, i64 poison, i32 3 + + ret i32 poison +} + +define i32 @insert_i32(i32 %arg) { +; LSX-LABEL: 'insert_i32' +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2i32_a = insertelement <2 x i32> poison, i32 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i32_0 = insertelement <2 x i32> poison, i32 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i32_1 = insertelement <2 x i32> poison, i32 poison, i32 1 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4i32_a = insertelement <4 x i32> poison, i32 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i32_0 = insertelement <4 x i32> poison, i32 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i32_3 = insertelement <4 x i32> poison, i32 poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v8i32_a = insertelement <8 x i32> poison, i32 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v8i32_0 = insertelement <8 x i32> poison, i32 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v8i32_3 = insertelement <8 x i32> poison, i32 poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v8i32_4 = insertelement <8 x i32> poison, i32 poison, i32 4 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v8i32_7 = insertelement <8 x i32> poison, i32 poison, i32 7 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'insert_i32' +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2i32_a = insertelement <2 x i32> poison, i32 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i32_0 = insertelement <2 x i32> poison, i32 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i32_1 = insertelement <2 x i32> poison, i32 poison, i32 1 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4i32_a = insertelement <4 x i32> poison, i32 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i32_0 = insertelement <4 x i32> poison, i32 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i32_3 = insertelement <4 x i32> poison, i32 poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v8i32_a = insertelement <8 x i32> poison, i32 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:4 SizeLat:1 for: %v8i32_0 = insertelement <8 x i32> poison, i32 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:4 SizeLat:1 for: %v8i32_3 = insertelement <8 x i32> poison, i32 poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of RThru:6 CodeSize:3 Lat:6 SizeLat:3 for: %v8i32_4 = insertelement <8 x i32> poison, i32 poison, i32 4 +; LASX-NEXT: Cost Model: Found costs of RThru:6 CodeSize:3 Lat:6 SizeLat:3 for: %v8i32_7 = insertelement <8 x i32> poison, i32 poison, i32 7 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %v2i32_a = insertelement <2 x i32> poison, i32 poison, i32 %arg + %v2i32_0 = insertelement <2 x i32> poison, i32 poison, i32 0 + %v2i32_1 = insertelement <2 x i32> poison, i32 poison, i32 1 + + %v4i32_a = insertelement <4 x i32> poison, i32 poison, i32 %arg + %v4i32_0 = insertelement <4 x i32> poison, i32 poison, i32 0 + %v4i32_3 = insertelement <4 x i32> poison, i32 poison, i32 3 + + %v8i32_a = insertelement <8 x i32> poison, i32 poison, i32 %arg + %v8i32_0 = insertelement <8 x i32> poison, i32 poison, i32 0 + %v8i32_3 = insertelement <8 x i32> poison, i32 poison, i32 3 + %v8i32_4 = insertelement <8 x i32> poison, i32 poison, i32 4 + %v8i32_7 = insertelement <8 x i32> poison, i32 poison, i32 7 + + ret i32 poison +} + +define i32 @insert_i16(i32 %arg) { +; LSX-LABEL: 'insert_i16' +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2i16_a = insertelement <2 x i16> poison, i16 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i16_0 = insertelement <2 x i16> poison, i16 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i16_1 = insertelement <2 x i16> poison, i16 poison, i32 1 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4i16_a = insertelement <4 x i16> poison, i16 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i16_0 = insertelement <4 x i16> poison, i16 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i16_3 = insertelement <4 x i16> poison, i16 poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v8i16_a = insertelement <8 x i16> poison, i16 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i16_0 = insertelement <8 x i16> poison, i16 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i16_7 = insertelement <8 x i16> poison, i16 poison, i32 7 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v16i16_a = insertelement <16 x i16> poison, i16 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v16i16_0 = insertelement <16 x i16> poison, i16 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v16i16_7 = insertelement <16 x i16> poison, i16 poison, i32 7 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v16i16_8 = insertelement <16 x i16> poison, i16 poison, i32 8 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v16i16_15 = insertelement <16 x i16> poison, i16 poison, i32 15 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'insert_i16' +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2i16_a = insertelement <2 x i16> poison, i16 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i16_0 = insertelement <2 x i16> poison, i16 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i16_1 = insertelement <2 x i16> poison, i16 poison, i32 1 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4i16_a = insertelement <4 x i16> poison, i16 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i16_0 = insertelement <4 x i16> poison, i16 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i16_3 = insertelement <4 x i16> poison, i16 poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v8i16_a = insertelement <8 x i16> poison, i16 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i16_0 = insertelement <8 x i16> poison, i16 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i16_7 = insertelement <8 x i16> poison, i16 poison, i32 7 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v16i16_a = insertelement <16 x i16> poison, i16 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i16_0 = insertelement <16 x i16> poison, i16 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i16_7 = insertelement <16 x i16> poison, i16 poison, i32 7 +; LASX-NEXT: Cost Model: Found costs of RThru:6 CodeSize:3 Lat:5 SizeLat:3 for: %v16i16_8 = insertelement <16 x i16> poison, i16 poison, i32 8 +; LASX-NEXT: Cost Model: Found costs of RThru:6 CodeSize:3 Lat:5 SizeLat:3 for: %v16i16_15 = insertelement <16 x i16> poison, i16 poison, i32 15 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %v2i16_a = insertelement <2 x i16> poison, i16 poison, i32 %arg + %v2i16_0 = insertelement <2 x i16> poison, i16 poison, i32 0 + %v2i16_1 = insertelement <2 x i16> poison, i16 poison, i32 1 + + %v4i16_a = insertelement <4 x i16> poison, i16 poison, i32 %arg + %v4i16_0 = insertelement <4 x i16> poison, i16 poison, i32 0 + %v4i16_3 = insertelement <4 x i16> poison, i16 poison, i32 3 + + %v8i16_a = insertelement <8 x i16> poison, i16 poison, i32 %arg + %v8i16_0 = insertelement <8 x i16> poison, i16 poison, i32 0 + %v8i16_7 = insertelement <8 x i16> poison, i16 poison, i32 7 + + %v16i16_a = insertelement <16 x i16> poison, i16 poison, i32 %arg + %v16i16_0 = insertelement <16 x i16> poison, i16 poison, i32 0 + %v16i16_7 = insertelement <16 x i16> poison, i16 poison, i32 7 + %v16i16_8 = insertelement <16 x i16> poison, i16 poison, i32 8 + %v16i16_15 = insertelement <16 x i16> poison, i16 poison, i32 15 + + ret i32 poison +} + +define i32 @insert_i8(i32 %arg) { +; LSX-LABEL: 'insert_i8' +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2i8_a = insertelement <2 x i8> poison, i8 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i8_0 = insertelement <2 x i8> poison, i8 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i8_3 = insertelement <2 x i8> poison, i8 poison, i32 1 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4i8_a = insertelement <4 x i8> poison, i8 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i8_0 = insertelement <4 x i8> poison, i8 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i8_3 = insertelement <4 x i8> poison, i8 poison, i32 3 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v8i8_a = insertelement <8 x i8> poison, i8 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i8_0 = insertelement <8 x i8> poison, i8 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i8_7 = insertelement <8 x i8> poison, i8 poison, i32 7 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v16i8_a = insertelement <16 x i8> poison, i8 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i8_0 = insertelement <16 x i8> poison, i8 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i8_8 = insertelement <16 x i8> poison, i8 poison, i32 8 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i8_15 = insertelement <16 x i8> poison, i8 poison, i32 15 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v32i8_a = insertelement <32 x i8> poison, i8 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i8_0 = insertelement <32 x i8> poison, i8 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i8_7 = insertelement <32 x i8> poison, i8 poison, i32 7 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i8_8 = insertelement <32 x i8> poison, i8 poison, i32 8 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i8_15 = insertelement <32 x i8> poison, i8 poison, i32 15 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i8_24 = insertelement <32 x i8> poison, i8 poison, i32 24 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i8_31 = insertelement <32 x i8> poison, i8 poison, i32 31 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'insert_i8' +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2i8_a = insertelement <2 x i8> poison, i8 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i8_0 = insertelement <2 x i8> poison, i8 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i8_3 = insertelement <2 x i8> poison, i8 poison, i32 1 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4i8_a = insertelement <4 x i8> poison, i8 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i8_0 = insertelement <4 x i8> poison, i8 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i8_3 = insertelement <4 x i8> poison, i8 poison, i32 3 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v8i8_a = insertelement <8 x i8> poison, i8 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i8_0 = insertelement <8 x i8> poison, i8 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i8_7 = insertelement <8 x i8> poison, i8 poison, i32 7 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v16i8_a = insertelement <16 x i8> poison, i8 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i8_0 = insertelement <16 x i8> poison, i8 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i8_8 = insertelement <16 x i8> poison, i8 poison, i32 8 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i8_15 = insertelement <16 x i8> poison, i8 poison, i32 15 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v32i8_a = insertelement <32 x i8> poison, i8 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i8_0 = insertelement <32 x i8> poison, i8 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i8_7 = insertelement <32 x i8> poison, i8 poison, i32 7 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i8_8 = insertelement <32 x i8> poison, i8 poison, i32 8 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i8_15 = insertelement <32 x i8> poison, i8 poison, i32 15 +; LASX-NEXT: Cost Model: Found costs of RThru:6 CodeSize:3 Lat:5 SizeLat:3 for: %v32i8_24 = insertelement <32 x i8> poison, i8 poison, i32 24 +; LASX-NEXT: Cost Model: Found costs of RThru:6 CodeSize:3 Lat:5 SizeLat:3 for: %v32i8_31 = insertelement <32 x i8> poison, i8 poison, i32 31 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %v2i8_a = insertelement <2 x i8> poison, i8 poison, i32 %arg + %v2i8_0 = insertelement <2 x i8> poison, i8 poison, i32 0 + %v2i8_3 = insertelement <2 x i8> poison, i8 poison, i32 1 + + %v4i8_a = insertelement <4 x i8> poison, i8 poison, i32 %arg + %v4i8_0 = insertelement <4 x i8> poison, i8 poison, i32 0 + %v4i8_3 = insertelement <4 x i8> poison, i8 poison, i32 3 + + %v8i8_a = insertelement <8 x i8> poison, i8 poison, i32 %arg + %v8i8_0 = insertelement <8 x i8> poison, i8 poison, i32 0 + %v8i8_7 = insertelement <8 x i8> poison, i8 poison, i32 7 + + %v16i8_a = insertelement <16 x i8> poison, i8 poison, i32 %arg + %v16i8_0 = insertelement <16 x i8> poison, i8 poison, i32 0 + %v16i8_8 = insertelement <16 x i8> poison, i8 poison, i32 8 + %v16i8_15 = insertelement <16 x i8> poison, i8 poison, i32 15 + + %v32i8_a = insertelement <32 x i8> poison, i8 poison, i32 %arg + %v32i8_0 = insertelement <32 x i8> poison, i8 poison, i32 0 + %v32i8_7 = insertelement <32 x i8> poison, i8 poison, i32 7 + %v32i8_8 = insertelement <32 x i8> poison, i8 poison, i32 8 + %v32i8_15 = insertelement <32 x i8> poison, i8 poison, i32 15 + %v32i8_24 = insertelement <32 x i8> poison, i8 poison, i32 24 + %v32i8_31 = insertelement <32 x i8> poison, i8 poison, i32 31 + + ret i32 poison +} + +define i32 @insert_i1(i32 %arg) { +; LSX-LABEL: 'insert_i1' +; LSX-NEXT: Cost Model: Found costs of 1 for: %v2i1_a = insertelement <2 x i1> poison, i1 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i1_0 = insertelement <2 x i1> poison, i1 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i1_1 = insertelement <2 x i1> poison, i1 poison, i32 1 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v4i1_a = insertelement <4 x i1> poison, i1 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i1_0 = insertelement <4 x i1> poison, i1 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i1_2 = insertelement <4 x i1> poison, i1 poison, i32 2 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v8i1_a = insertelement <8 x i1> poison, i1 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i1_0 = insertelement <8 x i1> poison, i1 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i1_4 = insertelement <8 x i1> poison, i1 poison, i32 4 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v16i1_a = insertelement <16 x i1> poison, i1 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i1_0 = insertelement <16 x i1> poison, i1 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i1_8 = insertelement <16 x i1> poison, i1 poison, i32 8 +; LSX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i1_15 = insertelement <16 x i1> poison, i1 poison, i32 15 +; LSX-NEXT: Cost Model: Found costs of 1 for: %v32i1_a = insertelement <32 x i1> poison, i1 poison, i32 %arg +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i1_0 = insertelement <32 x i1> poison, i1 poison, i32 0 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i1_7 = insertelement <32 x i1> poison, i1 poison, i32 7 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i1_8 = insertelement <32 x i1> poison, i1 poison, i32 8 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i1_15 = insertelement <32 x i1> poison, i1 poison, i32 15 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i1_24 = insertelement <32 x i1> poison, i1 poison, i32 24 +; LSX-NEXT: Cost Model: Found costs of RThru:8 CodeSize:1 Lat:6 SizeLat:1 for: %v32i1_31 = insertelement <32 x i1> poison, i1 poison, i32 31 +; LSX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; +; LASX-LABEL: 'insert_i1' +; LASX-NEXT: Cost Model: Found costs of 1 for: %v2i1_a = insertelement <2 x i1> poison, i1 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i1_0 = insertelement <2 x i1> poison, i1 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v2i1_1 = insertelement <2 x i1> poison, i1 poison, i32 1 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v4i1_a = insertelement <4 x i1> poison, i1 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i1_0 = insertelement <4 x i1> poison, i1 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v4i1_2 = insertelement <4 x i1> poison, i1 poison, i32 2 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v8i1_a = insertelement <8 x i1> poison, i1 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i1_0 = insertelement <8 x i1> poison, i1 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v8i1_4 = insertelement <8 x i1> poison, i1 poison, i32 4 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v16i1_a = insertelement <16 x i1> poison, i1 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i1_0 = insertelement <16 x i1> poison, i1 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i1_8 = insertelement <16 x i1> poison, i1 poison, i32 8 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v16i1_15 = insertelement <16 x i1> poison, i1 poison, i32 15 +; LASX-NEXT: Cost Model: Found costs of 1 for: %v32i1_a = insertelement <32 x i1> poison, i1 poison, i32 %arg +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i1_0 = insertelement <32 x i1> poison, i1 poison, i32 0 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i1_7 = insertelement <32 x i1> poison, i1 poison, i32 7 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i1_8 = insertelement <32 x i1> poison, i1 poison, i32 8 +; LASX-NEXT: Cost Model: Found costs of RThru:4 CodeSize:1 Lat:3 SizeLat:1 for: %v32i1_15 = insertelement <32 x i1> poison, i1 poison, i32 15 +; LASX-NEXT: Cost Model: Found costs of RThru:6 CodeSize:3 Lat:5 SizeLat:3 for: %v32i1_24 = insertelement <32 x i1> poison, i1 poison, i32 24 +; LASX-NEXT: Cost Model: Found costs of RThru:6 CodeSize:3 Lat:5 SizeLat:3 for: %v32i1_31 = insertelement <32 x i1> poison, i1 poison, i32 31 +; LASX-NEXT: Cost Model: Found costs of 1 for: ret i32 poison +; + %v2i1_a = insertelement <2 x i1> poison, i1 poison, i32 %arg + %v2i1_0 = insertelement <2 x i1> poison, i1 poison, i32 0 + %v2i1_1 = insertelement <2 x i1> poison, i1 poison, i32 1 + + %v4i1_a = insertelement <4 x i1> poison, i1 poison, i32 %arg + %v4i1_0 = insertelement <4 x i1> poison, i1 poison, i32 0 + %v4i1_2 = insertelement <4 x i1> poison, i1 poison, i32 2 + + %v8i1_a = insertelement <8 x i1> poison, i1 poison, i32 %arg + %v8i1_0 = insertelement <8 x i1> poison, i1 poison, i32 0 + %v8i1_4 = insertelement <8 x i1> poison, i1 poison, i32 4 + + %v16i1_a = insertelement <16 x i1> poison, i1 poison, i32 %arg + %v16i1_0 = insertelement <16 x i1> poison, i1 poison, i32 0 + %v16i1_8 = insertelement <16 x i1> poison, i1 poison, i32 8 + %v16i1_15 = insertelement <16 x i1> poison, i1 poison, i32 15 + + %v32i1_a = insertelement <32 x i1> poison, i1 poison, i32 %arg + %v32i1_0 = insertelement <32 x i1> poison, i1 poison, i32 0 + %v32i1_7 = insertelement <32 x i1> poison, i1 poison, i32 7 + %v32i1_8 = insertelement <32 x i1> poison, i1 poison, i32 8 + %v32i1_15 = insertelement <32 x i1> poison, i1 poison, i32 15 + %v32i1_24 = insertelement <32 x i1> poison, i1 poison, i32 24 + %v32i1_31 = insertelement <32 x i1> poison, i1 poison, i32 31 + + ret i32 poison +}