diff options
author | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-01-24 18:06:05 +0000 |
---|---|---|
committer | Jakob Stoklund Olesen <stoklund@2pi.dk> | 2012-01-24 18:06:05 +0000 |
commit | 5b52f6d655e34de5c6fedbb71b6c94775cc10032 (patch) | |
tree | 147d3d1569f63029f88d6f987730ba84081f31f3 /utils | |
parent | 9136f2112ca67bf360ee64b6546abea9dce0579c (diff) | |
download | external_llvm-5b52f6d655e34de5c6fedbb71b6c94775cc10032.zip external_llvm-5b52f6d655e34de5c6fedbb71b6c94775cc10032.tar.gz external_llvm-5b52f6d655e34de5c6fedbb71b6c94775cc10032.tar.bz2 |
Add an (interleave A, B, ...) SetTheory operator.
This will interleave the elements from two or more lists.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@148824 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'utils')
-rw-r--r-- | utils/TableGen/SetTheory.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/utils/TableGen/SetTheory.cpp b/utils/TableGen/SetTheory.cpp index 838b924..0649fd1 100644 --- a/utils/TableGen/SetTheory.cpp +++ b/utils/TableGen/SetTheory.cpp @@ -139,6 +139,24 @@ struct DecimateOp : public SetIntBinOp { } }; +// (interleave S1, S2, ...) Interleave elements of the arguments. +struct InterleaveOp : public SetTheory::Operator { + void apply(SetTheory &ST, DagInit *Expr, RecSet &Elts) { + // Evaluate the arguments individually. + SmallVector<RecSet, 4> Args(Expr->getNumArgs()); + unsigned MaxSize = 0; + for (unsigned i = 0, e = Expr->getNumArgs(); i != e; ++i) { + ST.evaluate(Expr->getArg(i), Args[i]); + MaxSize = std::max(MaxSize, unsigned(Args[i].size())); + } + // Interleave arguments into Elts. + for (unsigned n = 0; n != MaxSize; ++n) + for (unsigned i = 0, e = Expr->getNumArgs(); i != e; ++i) + if (n < Args[i].size()) + Elts.insert(Args[i][n]); + } +}; + // (sequence "Format", From, To) Generate a sequence of records by name. struct SequenceOp : public SetTheory::Operator { void apply(SetTheory &ST, DagInit *Expr, RecSet &Elts) { @@ -211,6 +229,7 @@ SetTheory::SetTheory() { addOperator("rotl", new RotOp(false)); addOperator("rotr", new RotOp(true)); addOperator("decimate", new DecimateOp); + addOperator("interleave", new InterleaveOp); addOperator("sequence", new SequenceOp); } |