/*
* This file is part of the Jikes RVM project (http://jikesrvm.org).
*
* This file is licensed to You under the Eclipse Public License (EPL);
* You may not use this file except in compliance with the License. You
* may obtain a copy of the License at
*
* http://www.opensource.org/licenses/eclipse-1.0.php
*
* See the COPYRIGHT.txt file distributed with this work for information
* regarding copyright ownership.
*/
package org.jikesrvm.compilers.opt.ir;
import org.jikesrvm.VM;
/**
* A class to hold each element in the GCIRMap
*/
public class RegSpillListElement {
/**
* this should be a symbolic register
*/
private final Register symbolicReg;
/**
* This could be either a spill or a real reg number. Spills are stored
* as they are. For register numbers, we store the negative value.
*/
private int value;
/**
* Constructor
* @param symbolicReg the symbolic register holding the reference
*/
public RegSpillListElement(Register symbolicReg) {
this.symbolicReg = symbolicReg;
}
/**
* Sets the spill component associated with this object
* @param value the spill value
*/
public final void setSpill(int value) {
if (VM.VerifyAssertions) VM._assert(value > 0);
this.value = value;
}
/**
* Sets the real (i.e., physical) register component associated with
* this object
* @param reg the real (physical) register
*/
public final void setRealReg(Register reg) {
// we store registers as non-positive numbers to distinguish them from
// spills
this.value = -reg.number;
}
/**
* Is this a spill?
* @return whether this is a spill
*/
public final boolean isSpill() {
return (value > 0);
}
/**
* returns the symbolic register associated with this object
* @return the symbolic register associated with this object
*/
public final Register getSymbolicReg() {
return symbolicReg;
}
/**
* returns the real (physical) register associated with this object
* @return the real (physical) register associated with this object
*/
public final int getRealRegNumber() {
if (VM.VerifyAssertions) {
VM._assert(!isSpill(), "RegSpillListElement asked for a Real Reg, when it had a spill");
}
// real regs are stored as non-positive values
return -value;
}
/**
* returns the spill value associated with this object
* @return the spill value associated with this object
*/
public final int getSpill() {
if (VM.VerifyAssertions) {
VM._assert(isSpill(), "RegSpillListElement asked for a spill, when it had a real register");
}
return value;
}
/**
* return a string version of this object
* @return string version of this object
*/
@Override
public String toString() {
StringBuilder buf = new StringBuilder();
buf.append("(").append(symbolicReg).append(", ");
if (isSpill()) {
buf.append("Sp: ").append(getSpill());
} else {
buf.append("Reg: ").append(getRealRegNumber());
}
buf.append(") ");
return buf.toString();
}
}