mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-07 16:42:07 +00:00
Add a CoveringSubRegIndices field to SubRegIndex records.
This can be used to tell TableGen to use a specific SubRegIndex instead of synthesizing one when discovering all sub-registers. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@161982 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
3651e7dfec
commit
d024a20bf7
@ -28,6 +28,24 @@ class SubRegIndex<list<SubRegIndex> comps = []> {
|
||||
// ComposedOf - A list of two SubRegIndex instances, [A, B].
|
||||
// This indicates that this SubRegIndex is the result of composing A and B.
|
||||
list<SubRegIndex> ComposedOf = comps;
|
||||
|
||||
// CoveringSubRegIndices - A list of two or more sub-register indexes that
|
||||
// cover this sub-register.
|
||||
//
|
||||
// This field should normally be left blank as TableGen can infer it.
|
||||
//
|
||||
// TableGen automatically detects sub-registers that straddle the registers
|
||||
// in the SubRegs field of a Register definition. For example:
|
||||
//
|
||||
// Q0 = dsub_0 -> D0, dsub_1 -> D1
|
||||
// Q1 = dsub_0 -> D2, dsub_1 -> D3
|
||||
// D1_D2 = dsub_0 -> D1, dsub_1 -> D2
|
||||
// QQ0 = qsub_0 -> Q0, qsub_1 -> Q1
|
||||
//
|
||||
// TableGen will infer that D1_D2 is a sub-register of QQ0. It will be given
|
||||
// the synthetic index dsub_1_dsub_2 unless some SubRegIndex is defined with
|
||||
// CoveringSubRegIndices = [dsub_1, dsub_2].
|
||||
list<SubRegIndex> CoveringSubRegIndices = [];
|
||||
}
|
||||
|
||||
// RegAltNameIndex - The alternate name set to use for register operands of
|
||||
|
@ -50,16 +50,29 @@ std::string CodeGenSubRegIndex::getQualifiedName() const {
|
||||
void CodeGenSubRegIndex::updateComponents(CodeGenRegBank &RegBank) {
|
||||
if (!TheDef)
|
||||
return;
|
||||
|
||||
std::vector<Record*> Comps = TheDef->getValueAsListOfDefs("ComposedOf");
|
||||
if (Comps.empty())
|
||||
return;
|
||||
if (Comps.size() != 2)
|
||||
throw TGError(TheDef->getLoc(), "ComposedOf must have exactly two entries");
|
||||
CodeGenSubRegIndex *A = RegBank.getSubRegIdx(Comps[0]);
|
||||
CodeGenSubRegIndex *B = RegBank.getSubRegIdx(Comps[1]);
|
||||
CodeGenSubRegIndex *X = A->addComposite(B, this);
|
||||
if (X)
|
||||
throw TGError(TheDef->getLoc(), "Ambiguous ComposedOf entries");
|
||||
if (!Comps.empty()) {
|
||||
if (Comps.size() != 2)
|
||||
throw TGError(TheDef->getLoc(), "ComposedOf must have exactly two entries");
|
||||
CodeGenSubRegIndex *A = RegBank.getSubRegIdx(Comps[0]);
|
||||
CodeGenSubRegIndex *B = RegBank.getSubRegIdx(Comps[1]);
|
||||
CodeGenSubRegIndex *X = A->addComposite(B, this);
|
||||
if (X)
|
||||
throw TGError(TheDef->getLoc(), "Ambiguous ComposedOf entries");
|
||||
}
|
||||
|
||||
std::vector<Record*> Parts =
|
||||
TheDef->getValueAsListOfDefs("CoveringSubRegIndices");
|
||||
if (!Parts.empty()) {
|
||||
if (Parts.size() < 2)
|
||||
throw TGError(TheDef->getLoc(),
|
||||
"CoveredBySubRegs must have two or more entries");
|
||||
SmallVector<CodeGenSubRegIndex*, 8> IdxParts;
|
||||
for (unsigned i = 0, e = Parts.size(); i != e; ++i)
|
||||
IdxParts.push_back(RegBank.getSubRegIdx(Parts[i]));
|
||||
RegBank.addConcatSubRegIndex(IdxParts, this);
|
||||
}
|
||||
}
|
||||
|
||||
void CodeGenSubRegIndex::cleanComposites() {
|
||||
|
Loading…
x
Reference in New Issue
Block a user