blob: 52c5e6d80019474fa7147c4eeef0633a7bcbb464 [file]
//===-- TargetParser - Parser for target features ---------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file implements a target parser to recognise hardware features such as
// FPU/CPU/ARCH names as well as specific support such as HDIV, etc.
//
//===----------------------------------------------------------------------===//
#include "llvm/TargetParser/TargetParser.h"
#include "llvm/ADT/ArrayRef.h"
using namespace llvm;
/// Find KV in array using binary search.
static const BasicSubtargetSubTypeKV *
find(StringRef S, ArrayRef<BasicSubtargetSubTypeKV> A) {
// Binary search the array
const BasicSubtargetSubTypeKV *F = llvm::lower_bound(A, S);
// If not found then return NULL
if (F == A.end() || StringRef(F->Key) != S)
return nullptr;
// Return the found array item
return F;
}
/// For each feature that is (transitively) implied by this feature, set it.
static void setImpliedBits(FeatureBitset &Bits, const FeatureBitset &Implies,
ArrayRef<BasicSubtargetFeatureKV> FeatureTable) {
// OR the Implies bits in outside the loop. This allows the Implies for CPUs
// which might imply features not in FeatureTable to use this.
Bits |= Implies;
for (const auto &FE : FeatureTable)
if (Implies.test(FE.Value))
setImpliedBits(Bits, FE.Implies.getAsBitset(), FeatureTable);
}
std::optional<llvm::StringMap<bool>> llvm::getCPUDefaultTargetFeatures(
StringRef CPU, ArrayRef<BasicSubtargetSubTypeKV> ProcDesc,
ArrayRef<BasicSubtargetFeatureKV> ProcFeatures) {
if (CPU.empty())
return std::nullopt;
const BasicSubtargetSubTypeKV *CPUEntry = ::find(CPU, ProcDesc);
if (!CPUEntry)
return std::nullopt;
// Set the features implied by this CPU feature if there is a match.
FeatureBitset Bits;
llvm::StringMap<bool> DefaultFeatures;
setImpliedBits(Bits, CPUEntry->Implies.getAsBitset(), ProcFeatures);
[[maybe_unused]] unsigned BitSize = Bits.size();
for (const BasicSubtargetFeatureKV &FE : ProcFeatures) {
assert(FE.Value < BitSize && "Target Feature is out of range");
if (Bits[FE.Value])
DefaultFeatures[FE.Key] = true;
}
return DefaultFeatures;
}