void paint3(Reg *r, int bn, int32 rb, int rn) { Reg *r1; Prog *p; int z; uint32 bb; z = bn/32; bb = 1L << (bn%32); if(r->act.b[z] & bb) return; 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; } if(LOAD(r) & ~(r->set.b[z] & ~(r->use1.b[z]|r->use2.b[z])) & bb) addmove(r, bn, rn, 0); for(;;) { r->act.b[z] |= bb; p = r->f.prog; if(r->use1.b[z] & bb) { if(debug['R'] && debug['v']) print("%P", p); addreg(&p->from, rn); if(debug['R'] && debug['v']) print(" ===change== %P\n", p); } if((r->use2.b[z]|r->set.b[z]) & bb) { if(debug['R'] && debug['v']) print("%P", p); addreg(&p->to, rn); if(debug['R'] && debug['v']) print(" ===change== %P\n", p); } if(STORE(r) & r->regdiff.b[z] & bb) addmove(r, bn, rn, 1); r->regu |= rb; 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) paint3(r1, bn, rb, rn); if(!(r->refahead.b[z] & bb)) break; r1 = (Reg*)r->f.s2; if(r1 != R) if(r1->refbehind.b[z] & bb) paint3(r1, bn, rb, rn); r = (Reg*)r->f.s1; if(r == R) break; if(r->act.b[z] & bb) break; if(!(r->refbehind.b[z] & bb)) break; } }
static void doagentcmd(FILE *str,char *line) { char *agentname; char *instances; char *inst; char *ptr; char regline[500]; char cumlname[100]; REGINFO regs[100]; char temp[20]; int rmax = 0; int idx; unsigned int cumlmask; int agentidx; agentname = gettoken(&line); instances = gettoken(&line); if (!instances) { strcpy(temp,"*"); instances = temp; } fprintf(stderr,"Agent %s Instances %s\n",agentname,instances); if (agentcnt == MAXAGENTS) { fatal("Out of agent slots\n",NULL); } agentnames[agentcnt] = strdup(agentname); agentidx = agentcnt; agentcnt++; regline[0] = '\0'; while ((readline(str,regline,sizeof(regline)) >= 0) && (rmax < 100)) { char *atext,*subinst,*pfunc,*descr; if (regline[0] == '!') break; ptr = regline; atext = gettoken(&ptr); subinst = gettoken(&ptr); pfunc = gettoken(&ptr); descr = gettoken(&ptr); if (!descr) { fatal("Missing fields for ",atext); } regs[rmax].reg_addr = strdup(atext); regs[rmax].reg_subinst = strdup(subinst); regs[rmax].reg_printfunc = strdup(pfunc); regs[rmax].reg_description = strdup(descr); regs[rmax].reg_mask = 0; rmax++; } if (rmax == 100) fatal("Too many registers in section ",agentname); inst = strtok(instances,","); cumlmask = 0; while (inst) { char defname[100]; unsigned int curmask; sprintf(defname,"SOC_AGENT_%s%s", agentname,inst[0] == '*' ? "" : inst); curmask = newmask(); cumlmask |= curmask; addconst(defname,curmask); for (idx = 0; idx < rmax; idx++) { char descr[100]; char atext[200]; macroexpand(regs[idx].reg_addr,inst,atext); #if 0 strcpy(descr,agentname); if (inst[0] != '*') { strcat(descr,inst); } strcat(descr," "); if (regs[idx].reg_subinst[0] != '*') { strcat(descr,regs[idx].reg_subinst); strcat(descr," "); } strcat(descr,regs[idx].reg_description); #else strcpy(descr,regs[idx].reg_description); #endif addreg(agentname, agentidx, curmask, atext, inst, regs[idx].reg_subinst, regs[idx].reg_printfunc, descr); } inst = strtok(NULL,","); } if (instances[0] != '*') { sprintf(cumlname,"SOC_AGENT_%s",agentname); addconst(cumlname,cumlmask); } }