package elw.dp.mips;
import gnu.trove.TIntArrayList;
import gnu.trove.TIntIntHashMap;
import java.util.Arrays;
public class Registers {
private final TIntIntHashMap regToValue = new TIntIntHashMap();
private final TIntArrayList readRegs = new TIntArrayList();
private final TIntArrayList writeRegs = new TIntArrayList();
public int getReg(Reg reg) {
readRegs.add(reg.ordinal());
return getRegInternal(reg);
}
public int getRegInternal(final Reg reg) {
final int key = reg.ordinal();
return regToValue.get(key);
}
public int setReg(Reg reg, int value) {
final int key = reg.ordinal();
writeRegs.add(key);
return setRegInternal(reg, value);
}
private int setRegInternal(Reg reg, int value) {
if (Reg.roRegs.contains(reg)) {
// LATER log
return 0;
}
return regToValue.put(reg.ordinal(), value);
}
public void resetAccess() {
readRegs.clear();
writeRegs.clear();
}
public TIntArrayList getReadRegs() {
return readRegs;
}
public TIntArrayList getWriteRegs() {
return writeRegs;
}
public int[] getSetupRegOrdinals() {
// LATER optimize here
final int[] keys = regToValue.keys();
Arrays.sort(keys);
return keys;
}
public Reg[] getSetupRegs() {
final int[] regOrdinals = getSetupRegOrdinals();
return Reg.values(regOrdinals);
}
public void load(final TIntIntHashMap regMap) {
resetAccess();
regToValue.clear();
final int[] keys = regMap.keys();
for (int key : keys) {
regToValue.put(key, regMap.get(key));
}
}
public void unset(int[] regs) {
for (int reg : regs) {
regToValue.remove(reg);
}
}
}