示例#1
0
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;
}
示例#2
0
文件: main.cpp 项目: Mulla6518/ds2
//
// 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;
}