예제 #1
0
// 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;
}
예제 #2
0
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;
}
예제 #3
0
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;
}
예제 #4
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;
}