diff options
author | Andrew Trick <atrick@apple.com> | 2012-10-03 23:06:28 +0000 |
---|---|---|
committer | Andrew Trick <atrick@apple.com> | 2012-10-03 23:06:28 +0000 |
commit | 2062b1260fa9df3e69e7b4d24a657a0ebb7f8710 (patch) | |
tree | b34ff5dc391ba749e1ae3bf6fb29db3acd142cc3 /utils/TableGen/CodeGenSchedule.h | |
parent | fe05d98c253676d1ae6e0f03efde6b75fdae105d (diff) |
TableGen subtarget emitter, nearly first class support for SchedAlias.
A processor can now arbitrarily alias one SchedWrite onto
another. Only the SchedAlias definition need be within the processor
model. The aliased SchedWrite may be a SchedVariant, WriteSequence, or
transitively refer to another alias.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@165179 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils/TableGen/CodeGenSchedule.h')
-rw-r--r-- | utils/TableGen/CodeGenSchedule.h | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/utils/TableGen/CodeGenSchedule.h b/utils/TableGen/CodeGenSchedule.h index 226c3aed5c..211c05c8c6 100644 --- a/utils/TableGen/CodeGenSchedule.h +++ b/utils/TableGen/CodeGenSchedule.h @@ -43,8 +43,10 @@ void splitSchedReadWrites(const RecVec &RWDefs, /// IsVariadic controls whether the variants are expanded into multiple operands /// or a sequence of writes on one operand. struct CodeGenSchedRW { + unsigned Index; std::string Name; Record *TheDef; + bool IsRead; bool IsAlias; bool HasVariants; bool IsVariadic; @@ -52,10 +54,12 @@ struct CodeGenSchedRW { IdxVec Sequence; RecVec Aliases; - CodeGenSchedRW(): TheDef(0), IsAlias(false), HasVariants(false), + CodeGenSchedRW(): Index(0), TheDef(0), IsAlias(false), HasVariants(false), IsVariadic(false), IsSequence(false) {} - CodeGenSchedRW(Record *Def): TheDef(Def), IsAlias(false), IsVariadic(false) { + CodeGenSchedRW(unsigned Idx, Record *Def): Index(Idx), TheDef(Def), + IsAlias(false), IsVariadic(false) { Name = Def->getName(); + IsRead = Def->isSubClassOf("SchedRead"); HasVariants = Def->isSubClassOf("SchedVariant"); if (HasVariants) IsVariadic = Def->getValueAsBit("Variadic"); @@ -66,9 +70,10 @@ struct CodeGenSchedRW { IsSequence = Def->isSubClassOf("WriteSequence"); } - CodeGenSchedRW(const IdxVec &Seq, const std::string &Name): - Name(Name), TheDef(0), IsAlias(false), HasVariants(false), - IsVariadic(false), IsSequence(true), Sequence(Seq) { + CodeGenSchedRW(unsigned Idx, bool Read, const IdxVec &Seq, + const std::string &Name): + Index(Idx), Name(Name), TheDef(0), IsRead(Read), IsAlias(false), + HasVariants(false), IsVariadic(false), IsSequence(true), Sequence(Seq) { assert(Sequence.size() > 1 && "implied sequence needs >1 RWs"); } @@ -286,15 +291,14 @@ public: const CodeGenSchedRW &getSchedRW(unsigned Idx, bool IsRead) const { return IsRead ? getSchedRead(Idx) : getSchedWrite(Idx); } - CodeGenSchedRW &getSchedRW(Record *Def, unsigned &Idx) { + CodeGenSchedRW &getSchedRW(Record *Def) { bool IsRead = Def->isSubClassOf("SchedRead"); - Idx = getSchedRWIdx(Def, IsRead); + unsigned Idx = getSchedRWIdx(Def, IsRead); return const_cast<CodeGenSchedRW&>( IsRead ? getSchedRead(Idx) : getSchedWrite(Idx)); } - CodeGenSchedRW &getSchedRW(Record *Def) { - unsigned Idx; - return getSchedRW(Def, Idx); + const CodeGenSchedRW &getSchedRW(Record*Def) const { + return const_cast<CodeGenSchedModels&>(*this).getSchedRW(Def); } unsigned getSchedRWIdx(Record *Def, bool IsRead, unsigned After = 0) const; @@ -340,6 +344,8 @@ public: void findRWs(const RecVec &RWDefs, IdxVec &Writes, IdxVec &Reads) const; void findRWs(const RecVec &RWDefs, IdxVec &RWs, bool IsRead) const; void expandRWSequence(unsigned RWIdx, IdxVec &RWSeq, bool IsRead) const; + void expandRWSeqForProc(unsigned RWIdx, IdxVec &RWSeq, bool IsRead, + const CodeGenProcModel &ProcModel) const; unsigned addSchedClass(const IdxVec &OperWrites, const IdxVec &OperReads, const IdxVec &ProcIndices); |