package de.fuberlin.projectF.CodeGenerator.model;
import java.util.ArrayList;
public class Variable extends Reference {
ArrayList<StackAddress> stackAddresses;
ArrayList<RegisterAddress> regAddresses;
ArrayList<MMXRegisterAddress> mmxAddresses;
public Variable(String name, String type) {
super(name, type);
stackAddresses = new ArrayList<StackAddress>();
regAddresses = new ArrayList<RegisterAddress>();
mmxAddresses = new ArrayList<MMXRegisterAddress>();
}
public Variable(String name, String type, int stackPointer) {
this(name, type);
stackAddresses.add(new StackAddress(stackPointer - size));
}
public Variable(String name, String type, RegisterAddress reg) {
this(name, type);
regAddresses.add(reg);
}
public Variable(String name, String type, MMXRegisterAddress reg) {
this(name, type);
mmxAddresses.add(reg);
}
public Variable(String name, int size) {
super(name, "ascii", size);
}
@Override
public String getAddress() {
if (!regAddresses.isEmpty())
return getRegAddress().getFullName();
else if (!mmxAddresses.isEmpty()) {
return getMMXRegAddress().getFullName();
}
return stackAddresses.get(0).getFullName();
}
public void addStackAddress(StackAddress stackAddress) {
stackAddresses.add(stackAddress);
}
public RegisterAddress getRegAddress() {
return regAddresses.get(0);
}
public MMXRegisterAddress getMMXRegAddress() {
return mmxAddresses.get(0);
}
public boolean onlyInReg() {
return stackAddresses.size() == 0;
}
@Override
public boolean onStack() {
return !stackAddresses.isEmpty();
}
public boolean inReg(int i) {
for (RegisterAddress r : regAddresses)
if (r.regNumber == i)
return true;
return false;
}
public boolean inReg() {
return !regAddresses.isEmpty();
}
public boolean inMMXReg(int i) {
for (MMXRegisterAddress r : mmxAddresses)
if (r.regNumber == i)
return true;
return false;
}
public boolean inMMXReg() {
return !mmxAddresses.isEmpty();
}
public String getAddress(int offset) {
if (!regAddresses.isEmpty())
return getRegAddress().getFullName();
else if (!mmxAddresses.isEmpty())
return getMMXRegAddress().getFullName();
return stackAddresses.get(0).getFullName(offset);
}
public void freeRegister(RegisterAddress reg) {
regAddresses.remove(reg);
}
public void freeMMXRegister(MMXRegisterAddress reg) {
mmxAddresses.remove(reg);
}
}