From 721c201bd55ffb73cb2ba8d39e0570fa38c44e15 Mon Sep 17 00:00:00 2001 From: dim Date: Wed, 15 Aug 2012 19:34:23 +0000 Subject: Vendor import of llvm trunk r161861: http://llvm.org/svn/llvm-project/llvm/trunk@161861 --- utils/TableGen/SetTheory.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) (limited to 'utils/TableGen/SetTheory.cpp') diff --git a/utils/TableGen/SetTheory.cpp b/utils/TableGen/SetTheory.cpp index 0649fd1..46e6db1 100644 --- a/utils/TableGen/SetTheory.cpp +++ b/utils/TableGen/SetTheory.cpp @@ -160,9 +160,17 @@ struct InterleaveOp : public SetTheory::Operator { // (sequence "Format", From, To) Generate a sequence of records by name. struct SequenceOp : public SetTheory::Operator { void apply(SetTheory &ST, DagInit *Expr, RecSet &Elts) { - if (Expr->arg_size() != 3) + int Step = 1; + if (Expr->arg_size() > 4) throw "Bad args to (sequence \"Format\", From, To): " + Expr->getAsString(); + else if (Expr->arg_size() == 4) { + if (IntInit *II = dynamic_cast(Expr->arg_begin()[3])) { + Step = II->getValue(); + } else + throw "Stride must be an integer: " + Expr->getAsString(); + } + std::string Format; if (StringInit *SI = dynamic_cast(Expr->arg_begin()[0])) Format = SI->getValue(); @@ -187,8 +195,12 @@ struct SequenceOp : public SetTheory::Operator { RecordKeeper &Records = dynamic_cast(*Expr->getOperator()).getDef()->getRecords(); - int Step = From <= To ? 1 : -1; - for (To += Step; From != To; From += Step) { + Step *= From <= To ? 1 : -1; + while (true) { + if (Step > 0 && From > To) + break; + else if (Step < 0 && From < To) + break; std::string Name; raw_string_ostream OS(Name); OS << format(Format.c_str(), unsigned(From)); @@ -200,6 +212,8 @@ struct SequenceOp : public SetTheory::Operator { Elts.insert(Result->begin(), Result->end()); else Elts.insert(Rec); + + From += Step; } } }; -- cgit v1.1