if (OpBit->getValue())
OpInfo.InitValue |= 1ULL << I;
- unsigned Base = ~0U;
- unsigned Width = 0;
- unsigned Offset = 0;
-
- for (unsigned bi = 0; bi < Bits.getNumBits(); ++bi) {
- VarInit *Var = nullptr;
- VarBitInit *BI = dyn_cast<VarBitInit>(Bits.getBit(bi));
- if (BI)
- Var = dyn_cast<VarInit>(BI->getBitVar());
- else
- Var = dyn_cast<VarInit>(Bits.getBit(bi));
-
- if (!Var) {
- if (Base != ~0U) {
- OpInfo.addField(Base, Width, Offset);
- Base = ~0U;
- Width = 0;
- Offset = 0;
- }
- continue;
- }
-
- if ((Var->getName() != OpName &&
- Var->getName() != TiedNames[std::string(OpName)])) {
- if (Base != ~0U) {
- OpInfo.addField(Base, Width, Offset);
- Base = ~0U;
- Width = 0;
- Offset = 0;
+ for (unsigned I = 0, J = 0; I != Bits.getNumBits(); I = J) {
+ VarInit *Var;
+ unsigned Offset = 0;
+ for (; J != Bits.getNumBits(); ++J) {
+ VarBitInit *BJ = dyn_cast<VarBitInit>(Bits.getBit(J));
+ if (BJ) {
+ Var = dyn_cast<VarInit>(BJ->getBitVar());
+ if (I == J)
+ Offset = BJ->getBitNum();
+ else if (BJ->getBitNum() != Offset + J - I)
+ break;
+ } else {
+ Var = dyn_cast<VarInit>(Bits.getBit(J));
}
- continue;
- }
-
- if (Base == ~0U) {
- Base = bi;
- Width = 1;
- Offset = BI ? BI->getBitNum() : 0;
- } else if (BI && BI->getBitNum() != Offset + Width) {
- OpInfo.addField(Base, Width, Offset);
- Base = bi;
- Width = 1;
- Offset = BI->getBitNum();
- } else {
- ++Width;
+ if (!Var || (Var->getName() != OpName &&
+ Var->getName() != TiedNames[std::string(OpName)]))
+ break;
}
+ if (I == J)
+ ++J;
+ else
+ OpInfo.addField(I, J - I, Offset);
}
-
- if (Base != ~0U)
- OpInfo.addField(Base, Width, Offset);
}
static unsigned