uint32 paint2(Reg *r, int bn) { Reg *r1; int z; uint32 bb, vreg, x; z = bn/32; bb = 1L << (bn%32); vreg = regbits; if(!(r->act.b[z] & bb)) return vreg; for(;;) { if(!(r->refbehind.b[z] & bb)) break; r1 = (Reg*)r->f.p1; if(r1 == R) break; if(!(r1->refahead.b[z] & bb)) break; if(!(r1->act.b[z] & bb)) break; r = r1; } for(;;) { r->act.b[z] &= ~bb; vreg |= r->regu; if(r->refbehind.b[z] & bb) for(r1 = (Reg*)r->f.p2; r1 != R; r1 = (Reg*)r1->f.p2link) if(r1->refahead.b[z] & bb) vreg |= paint2(r1, bn); if(!(r->refahead.b[z] & bb)) break; r1 = (Reg*)r->f.s2; if(r1 != R) if(r1->refbehind.b[z] & bb) vreg |= paint2(r1, bn); r = (Reg*)r->f.s1; if(r == R) break; if(!(r->act.b[z] & bb)) break; if(!(r->refbehind.b[z] & bb)) break; } bb = vreg; for(; r; r=(Reg*)r->f.s1) { x = r->regu & ~bb; if(x) { vreg |= reguse(r, x); bb |= regset(r, x); } } return vreg; }
// // Process all register sets in the definition file. // static bool ProcessRegisterSets(Context &ctx, JSDictionary const *d) { for (auto name : *d) { if (ctx.RegisterSets.find(name) != ctx.RegisterSets.end()) { fprintf(stderr, "error: register set '%s' is already defined\n", name.c_str()); return false; } RegisterSet::shared_ptr regset(new RegisterSet); if (!regset->parse(ctx, name, d->value<JSDictionary>(name))) return false; ctx.RegisterSets[name] = regset; // // Now merge the registers into the global registers map, // we need to check that the register name is unique across // all the register sets, this is due to avoid conflicts in // the resulting C++ and Header files. // for (auto reg : *regset) { if (reg->Private) continue; if (ctx.PublicRegisters.find(reg->Name) != ctx.PublicRegisters.end()) { fprintf(stderr, "error: register '%s' in register set '%s' " "is already defined\n", reg->Name.c_str(), regset->name().c_str()); return false; } if (!reg->LLDBName.empty() && ctx.PublicRegisters.find(reg->LLDBName) != ctx.PublicRegisters.end()) { fprintf(stderr, "error: register '%s' in register set '%s' " "is already defined\n", reg->LLDBName.c_str(), regset->name().c_str()); return false; } reg->Index = ctx.PublicRegisters.size(); ctx.PublicRegisters[reg->Name] = reg; if (!reg->LLDBName.empty()) { ctx.PublicRegisters[reg->LLDBName] = reg; } } } return true; }