uint32_t RegAlloc::countActive() { int cnt = 0; for(Register i=FirstReg; i <= LastReg; i = nextreg(i)) cnt += active[i] ? 1 : 0; return cnt; }
uint32_t RegAlloc::countFree() { int cnt = 0; for(Register i=FirstReg; i <= LastReg; i = nextreg(i)) cnt += isFree(i) ? 1 : 0; return cnt; }
NIns* Assembler::genPrologue(RegisterMask needSaving) { /** * Prologue */ uint32_t stackNeeded = STACK_GRANULARITY * _activation.highwatermark; uint32_t savingCount = 0; for(Register i=FirstReg; i <= LastReg; i = nextreg(i)) if (needSaving&rmask(i)) savingCount++; // After forcing alignment, we've pushed the pre-alignment SP // and savingCount registers. uint32_t stackPushed = STACK_GRANULARITY * (1+savingCount); uint32_t aligned = alignUp(stackNeeded + stackPushed, NJ_ALIGN_STACK); uint32_t amt = aligned - stackPushed; // Reserve stackNeeded bytes, padded // to preserve NJ_ALIGN_STACK-byte alignment. if (amt) { #if defined NANOJIT_IA32 SUBi(SP, amt); #elif defined NANOJIT_AMD64 SUBQi(SP, amt); #endif } verbose_only( verbose_outputf(" %p:",_nIns); )
// scan table for instruction with the lowest priority, meaning it is used // furthest in the future. LIns* Assembler::findVictim(RegAlloc ®s, RegisterMask allow) { NanoAssert(allow != 0); LIns *i, *a=0; int allow_pri = 0x7fffffff; for (Register r=FirstReg; r <= LastReg; r = nextreg(r)) { if ((allow & rmask(r)) && (i = regs.getActive(r)) != 0) { int pri = canRemat(i) ? 0 : regs.getPriority(r); if (!a || pri < allow_pri) { a = i; allow_pri = pri; } } } NanoAssert(a != 0); return a; }
void RegAlloc::formatRegisters(char* s, Fragment *frag) { if (!frag || !frag->lirbuf) return; LirNameMap *names = frag->lirbuf->names; for (Register r = FirstReg; r <= LastReg; r = nextreg(r)) { LIns *ins = getActive(r); if (!ins) continue; NanoAssertMsg(!isFree(r), "Coding error; register is both free and active! " ); if (ins->isop(LIR_param) && ins->paramKind()==1 && r == Assembler::savedRegs[ins->paramArg()]) { // dont print callee-saved regs that arent used continue; } s += VMPI_strlen(s); const char* rname = ins->isQuad() ? fpn(r) : gpn(r); VMPI_sprintf(s, " %s(%s)", rname, names->formatRef(ins)); } }