import IR.*;
public class PrefetchPair {
- TempDescriptor td;
- FieldDescriptor[] fd;
- int arryindex;
+ public TempDescriptor base;
+ public ArrayList<Descriptor> desc;
+
+ public PrefetchPair(){
+ base = new TempDescriptor("");
+ desc = new ArrayList<Descriptor>();
+ }
+
+ public PrefetchPair(TempDescriptor t, Descriptor f) {
+ base = t;
+ desc = new ArrayList<Descriptor>();
+ desc.add(f);
+ }
- public PrefetchPair() {
- }
-
- public PrefetchPair(TempDescriptor td) {
- this.td = td;
- }
-
- public PrefetchPair(TempDescriptor td, int index) {
- this.td = td;
- fd = new FieldDescriptor[index];
- arryindex = index;
- }
+ public PrefetchPair(TempDescriptor t, ArrayList<Descriptor> descriptor) {
+ base = t;
+ desc = new ArrayList<Descriptor>();
+ desc.addAll(descriptor);
+ }
- public TempDescriptor getTemp() {
- return td;
+ public TempDescriptor getBase() {
+ return base;
+ }
+
+ public Descriptor getDescAt(int index) {
+ return desc.get(index);
+ }
+
+ public ArrayList<Descriptor> getDesc() {
+ return desc;
+ }
+
+ public FieldDescriptor getFieldDesc(int index) {
+ return (FieldDescriptor) desc.get(index);
+ }
+
+ public IndexDescriptor getIndexDesc(int index) {
+ return (IndexDescriptor) desc.get(index);
+ }
+
+ public int hashCode() {
+ int hashcode = base.toString().hashCode();
+ if(desc != null) {
+ hashcode^=desc.hashCode();
}
-
- public FieldDescriptor getField(int index) {
- return fd[index];
+ return hashcode;
+ }
+
+ public String toString() {
+ String label= getBase().toString();
+ if(getDesc() == null)
+ return label;
+ ListIterator it=getDesc().listIterator();
+ for(;it.hasNext();) {
+ Object o = it.next();
+ if(o instanceof FieldDescriptor) {
+ FieldDescriptor fd = (FieldDescriptor) o;
+ label+="."+ fd.toString();
+ } else {
+ IndexDescriptor id = (IndexDescriptor) o;
+ label+= id.toString();
+ }
}
-
- public int getIndex() {
- return arryindex;
+ return label;
+ }
+
+ public boolean equals(Object o) {
+ if(o instanceof PrefetchPair) {
+ PrefetchPair pp = (PrefetchPair) o;
+ return base == pp.base && desc.equals(pp.desc);
}
-
- public int hashCode() {
- int hashcode = td.hashCode();
- for(int i=0; i<arryindex; i++) {
- hashcode = hashcode ^ fd[i].hashCode();
+ return false;
+ }
+
+ public Object clone() {
+ PrefetchPair newpp = new PrefetchPair();
+ newpp.base = this.base;
+ for(int i = 0; i < this.desc.size(); i++) {
+ Object o = desc.get(i);
+ if(o instanceof FieldDescriptor) {
+ newpp.desc.add((FieldDescriptor) o);
+ } else {
+ ArrayList<TempDescriptor> td = new ArrayList<TempDescriptor>();
+ for(int j = 0; j < ((IndexDescriptor)o).tddesc.size(); j++) {
+ td.add(((IndexDescriptor)o).getTempDescAt(j));
}
- return hashcode;
+ IndexDescriptor idesc = new IndexDescriptor();
+ idesc.tddesc = td;
+ idesc.offset = ((IndexDescriptor)o).offset;
+ newpp.desc.add(idesc);
+ }
}
+ return newpp;
+ }
- public String toString() {
- //if(getTemp()!=null)
- return"<"+getTemp()+">";
+ /** This function returns true if a tempdescriptor object is found in the array of descriptors
+ * for a given prefetch pair else returns false*/
+ public boolean containsTemp(TempDescriptor td) {
+ ArrayList<Descriptor> desc = (ArrayList<Descriptor>) getDesc();
+ for(ListIterator it = desc.listIterator();it.hasNext();) {
+ Object o = it.next();
+ if(o instanceof IndexDescriptor) {
+ ArrayList<TempDescriptor> tdarray = (ArrayList<TempDescriptor>)((IndexDescriptor)o).tddesc;
+ if(tdarray.contains(td)) {
+ return true;
+ }
+ }
}
+ return false;
+ }
- public boolean equals(Object o) {
- if(o instanceof PrefetchPair) {
- PrefetchPair pp = (PrefetchPair) o;
- if(td != pp.td)
- return false;
- for(int i=0; i< arryindex; i++) {
- if(!fd[i].equals(pp.fd[i]))
- return false;
- }
+ /** This function creates a new Arraylist of Descriptors by replacing old tempdescriptors with new
+ * tempdescriptors when there is a match */
+ public PrefetchPair replaceTemp(TempDescriptor td, TempDescriptor[] newtd) {
+ PrefetchPair npp=(PrefetchPair)clone();
+ ArrayList<Descriptor> desc = (ArrayList<Descriptor>) npp.getDesc();
+ for(ListIterator it = desc.listIterator();it.hasNext();) {
+ Object currdesc = it.next();
+ if(currdesc instanceof IndexDescriptor) {
+ ArrayList<TempDescriptor> tdarray = (ArrayList<TempDescriptor>)((IndexDescriptor)currdesc).tddesc;
+ if (tdarray.contains(td)) {
+ int index = tdarray.indexOf(td);
+ tdarray.set(index, newtd[0]);
+ for(int i=1;i<newtd.length;i++) {
+ tdarray.add(newtd[i]);
+ }
}
- return false;
+ }
}
+ return npp;
+ }
+
}