mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-24 23:28:41 +00:00
Add an "implies" field to features. This indicates that, if the current
feature is set, then the features in the implied list should be set also. The opposite is also enforced: if a feature in the implied list isn't set, then the feature that owns that implies list shouldn't be set either. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36756 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -199,6 +199,43 @@ void SubtargetFeatures::setCPUIfNone(const std::string &String) {
|
||||
if (Features[0].empty()) setCPU(String);
|
||||
}
|
||||
|
||||
/// SetImpliedBits - For each feature that is (transitively) implied by this
|
||||
/// feature, set it.
|
||||
///
|
||||
static
|
||||
void SetImpliedBits(uint32_t &Bits, const SubtargetFeatureKV *FeatureEntry,
|
||||
const SubtargetFeatureKV *FeatureTable,
|
||||
size_t FeatureTableSize) {
|
||||
for (size_t i = 0; i < FeatureTableSize; ++i) {
|
||||
const SubtargetFeatureKV &FE = FeatureTable[i];
|
||||
|
||||
if (FeatureEntry->Value == FE.Value) continue;
|
||||
|
||||
if (FeatureEntry->Implies & FE.Value) {
|
||||
Bits |= FE.Value;
|
||||
SetImpliedBits(Bits, &FE, FeatureTable, FeatureTableSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// ClearImpliedBits - For each feature that (transitively) implies this
|
||||
/// feature, clear it.
|
||||
///
|
||||
static
|
||||
void ClearImpliedBits(uint32_t &Bits, const SubtargetFeatureKV *FeatureEntry,
|
||||
const SubtargetFeatureKV *FeatureTable,
|
||||
size_t FeatureTableSize) {
|
||||
for (size_t i = 0; i < FeatureTableSize; ++i) {
|
||||
const SubtargetFeatureKV &FE = FeatureTable[i];
|
||||
|
||||
if (FeatureEntry->Value == FE.Value) continue;
|
||||
|
||||
if (FE.Implies & FeatureEntry->Value) {
|
||||
Bits &= ~FE.Value;
|
||||
ClearImpliedBits(Bits, &FE, FeatureTable, FeatureTableSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// getBits - Get feature bits.
|
||||
///
|
||||
@@ -251,8 +288,17 @@ uint32_t SubtargetFeatures::getBits(const SubtargetFeatureKV *CPUTable,
|
||||
// If there is a match
|
||||
if (FeatureEntry) {
|
||||
// Enable/disable feature in bits
|
||||
if (isEnabled(Feature)) Bits |= FeatureEntry->Value;
|
||||
else Bits &= ~FeatureEntry->Value;
|
||||
if (isEnabled(Feature)) {
|
||||
Bits |= FeatureEntry->Value;
|
||||
|
||||
// For each feature that this implies, set it.
|
||||
SetImpliedBits(Bits, FeatureEntry, FeatureTable, FeatureTableSize);
|
||||
} else {
|
||||
Bits &= ~FeatureEntry->Value;
|
||||
|
||||
// For each feature that implies this, clear it.
|
||||
ClearImpliedBits(Bits, FeatureEntry, FeatureTable, FeatureTableSize);
|
||||
}
|
||||
} else {
|
||||
cerr << "'" << Feature
|
||||
<< "' is not a recognized feature for this target"
|
||||
@@ -260,6 +306,7 @@ uint32_t SubtargetFeatures::getBits(const SubtargetFeatureKV *CPUTable,
|
||||
<< "\n";
|
||||
}
|
||||
}
|
||||
|
||||
return Bits;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user