// 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; }
void flushRegister(int reg){ if(regMap[reg].map.lo >= 0){ if(regMap[reg].dirty) _flushRegister(reg); if(regMap[reg].map.hi >= 0) availableRegs[ regMap[reg].map.hi ] = 1; availableRegs[ regMap[reg].map.lo ] = 1; } regMap[reg].map.hi = regMap[reg].map.lo = -1; }
void flushRegister(int gpr){ if(regMap[gpr].map.lo >= 0){ if(regMap[gpr].dirty) _flushRegister(gpr); if(regMap[gpr].map.hi >= 0) availableRegs[ regMap[gpr].map.hi ] = 1; availableRegs[ regMap[gpr].map.lo ] = 1; } regMap[gpr].map.hi = regMap[gpr].map.lo = -1; regMap[gpr].constant = 0; }
static RegMapping flushLRURegister(void){ int i, lru_i = 0, lru_v = 0x7fffffff; for(i=1; i<34; ++i){ if(regMap[i].map.lo >= 0 && regMap[i].lru < lru_v){ lru_i = i; lru_v = regMap[i].lru; } } RegMapping map = regMap[lru_i].map; // Flush the register if its dirty if(regMap[lru_i].dirty) _flushRegister(lru_i); // Mark unmapped regMap[lru_i].map.hi = regMap[lru_i].map.lo = -1; return map; }