void flushFPR(int fpr){ if(fprMap[fpr].map >= 0){ if(fprMap[fpr].dirty) _flushFPR(fpr); availableFPRs[ fprMap[fpr].map ] = 1; } fprMap[fpr].map = -1; }
// Unmapping registers int flushRegisters(void){ int i, flushed = 0; // Flush GPRs for(i=1; i<34; ++i){ if(regMap[i].map.lo >= 0 && regMap[i].dirty){ _flushRegister(i); ++flushed; } // Mark unmapped regMap[i].map.hi = regMap[i].map.lo = -1; } memcpy(availableRegs, availableRegsDefault, 32*sizeof(int)); nextLRUVal = 0; // Flush FPRs for(i=0; i<32; ++i){ if(fprMap[i].map >= 0 && fprMap[i].dirty){ _flushFPR(i); ++flushed; } // Mark unmapped fprMap[i].map = -1; } memcpy(availableFPRs, availableFPRsDefault, 32*sizeof(int)); nextLRUValFPR = 0; return flushed; }
static int flushLRUFPR(void){ int i, lru_i = 0, lru_v = 0x7fffffff; for(i=0; i<32; ++i){ if(fprMap[i].map >= 0 && fprMap[i].lru < lru_v){ lru_i = i; lru_v = fprMap[i].lru; } } int map = fprMap[lru_i].map; // Flush the register if its dirty if(fprMap[lru_i].dirty) _flushFPR(lru_i); // Mark unmapped fprMap[lru_i].map = -1; return map; }