//===- lib/CodeGen/GlobalISel/LegalizerPredicates.cpp - Predicates --------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // A library of predicate factories to use for LegalityPredicate. // //===----------------------------------------------------------------------===// #include "llvm/CodeGen/GlobalISel/LegalizerInfo.h" using namespace llvm; LegalityPredicate LegalityPredicates::typeIs(unsigned TypeIdx, LLT Type) { return [=](const LegalityQuery &Query) { return Query.Types[TypeIdx] == Type; }; } LegalityPredicate LegalityPredicates::typeInSet(unsigned TypeIdx, std::initializer_list TypesInit) { SmallVector Types = TypesInit; return [=](const LegalityQuery &Query) { return std::find(Types.begin(), Types.end(), Query.Types[TypeIdx]) != Types.end(); }; } LegalityPredicate LegalityPredicates::typePairInSet( unsigned TypeIdx0, unsigned TypeIdx1, std::initializer_list> TypesInit) { SmallVector, 4> Types = TypesInit; return [=](const LegalityQuery &Query) { std::pair Match = {Query.Types[TypeIdx0], Query.Types[TypeIdx1]}; return std::find(Types.begin(), Types.end(), Match) != Types.end(); }; } LegalityPredicate LegalityPredicates::typePairAndMemSizeInSet( unsigned TypeIdx0, unsigned TypeIdx1, unsigned MMOIdx, std::initializer_list TypesAndMemSizeInit) { SmallVector TypesAndMemSize = TypesAndMemSizeInit; return [=](const LegalityQuery &Query) { TypePairAndMemSize Match = {Query.Types[TypeIdx0], Query.Types[TypeIdx1], Query.MMODescrs[MMOIdx].Size}; return std::find(TypesAndMemSize.begin(), TypesAndMemSize.end(), Match) != TypesAndMemSize.end(); }; } LegalityPredicate LegalityPredicates::isScalar(unsigned TypeIdx) { return [=](const LegalityQuery &Query) { return Query.Types[TypeIdx].isScalar(); }; } LegalityPredicate LegalityPredicates::narrowerThan(unsigned TypeIdx, unsigned Size) { return [=](const LegalityQuery &Query) { const LLT &QueryTy = Query.Types[TypeIdx]; return QueryTy.isScalar() && QueryTy.getSizeInBits() < Size; }; } LegalityPredicate LegalityPredicates::widerThan(unsigned TypeIdx, unsigned Size) { return [=](const LegalityQuery &Query) { const LLT &QueryTy = Query.Types[TypeIdx]; return QueryTy.isScalar() && QueryTy.getSizeInBits() > Size; }; } LegalityPredicate LegalityPredicates::sizeNotPow2(unsigned TypeIdx) { return [=](const LegalityQuery &Query) { const LLT &QueryTy = Query.Types[TypeIdx]; return QueryTy.isScalar() && !isPowerOf2_32(QueryTy.getSizeInBits()); }; } LegalityPredicate LegalityPredicates::memSizeInBytesNotPow2(unsigned MMOIdx) { return [=](const LegalityQuery &Query) { return !isPowerOf2_32(Query.MMODescrs[MMOIdx].Size /* In Bytes */); }; } LegalityPredicate LegalityPredicates::numElementsNotPow2(unsigned TypeIdx) { return [=](const LegalityQuery &Query) { const LLT &QueryTy = Query.Types[TypeIdx]; return QueryTy.isVector() && isPowerOf2_32(QueryTy.getNumElements()); }; } LegalityPredicate LegalityPredicates::atomicOrderingAtLeastOrStrongerThan( unsigned MMOIdx, AtomicOrdering Ordering) { return [=](const LegalityQuery &Query) { return isAtLeastOrStrongerThan(Query.MMODescrs[MMOIdx].Ordering, Ordering); }; }