1 cananian 1.1.2.7  // Code.java, created Tue Nov  2  2:07:03 1999 by andyb
  2 andyb    1.1.2.1  // Copyright (C) 1999 Andrew Berkheimer <andyb@mit.edu>
  3 andyb    1.1.2.1  // Licensed under the terms of the GNU GPL; see COPYING for details.
  4 andyb    1.1.2.1  package harpoon.Backend.Sparc;
  5 andyb    1.1.2.1  
  6 andyb    1.1.2.3  import harpoon.Analysis.Instr.TempInstrPair;
  7 andyb    1.1.2.1  import harpoon.ClassFile.HCode;
  8 andyb    1.1.2.1  import harpoon.ClassFile.HCodeElement;
  9 andyb    1.1.2.1  import harpoon.ClassFile.HCodeFactory;
 10 andyb    1.1.2.1  import harpoon.ClassFile.HMethod;
 11 andyb    1.1.2.1  import harpoon.IR.Assem.Instr;
 12 andyb    1.1.2.3  import harpoon.IR.Tree.CanonicalTreeCode;
 13 andyb    1.1.2.1  import harpoon.Temp.Temp;
 14 andyb    1.1.2.1  import harpoon.Util.Util;
 15 andyb    1.1.2.1  
 16 andyb    1.1.2.1  import java.lang.String;
 17 andyb    1.1.2.1  
 18 andyb    1.1.2.10 import java.util.Collection;
 19 andyb    1.1.2.10 import java.util.Collections;
 20 andyb    1.1.2.10 import java.util.Arrays;
 21 andyb    1.1.2.1  import java.util.HashMap;
 22 andyb    1.1.2.1  import java.util.List;
 23 andyb    1.1.2.1  import java.util.Map;
 24 andyb    1.1.2.10 import java.util.Set;
 25 andyb    1.1.2.1  
 26 andyb    1.1.2.1  /**
 27 andyb    1.1.2.1   * <code>Code</code> is a code-view for SPARC assembly.
 28 andyb    1.1.2.1   *
 29 andyb    1.1.2.1   * @author  Andrew Berkheimer <andyb@mit.edu>
 30 cananian 1.4       * @version $Id: Code.java,v 1.4 2002/04/10 03:03:51 cananian Exp $
 31 andyb    1.1.2.1   */
 32 cananian 1.1.2.11 class Code extends harpoon.Backend.Generic.Code {
 33 andyb    1.1.2.1      public static final String codename = "sparc";
 34 andyb    1.1.2.1  
 35 andyb    1.1.2.2      private Map tempInstrPairToRegisterMap;
 36 andyb    1.1.2.1  
 37 andyb    1.1.2.1      public Code(harpoon.IR.Tree.Code treeCode) {
 38 cananian 1.1.2.8          super(treeCode);
 39 andyb    1.1.2.1  
 40 andyb    1.1.2.3          tempInstrPairToRegisterMap = new HashMap();
 41 andyb    1.1.2.1      }
 42 andyb    1.1.2.1  
 43 andyb    1.1.2.1      public String getName() { return codename; }
 44 andyb    1.1.2.1  
 45 andyb    1.1.2.3      public static HCodeFactory codeFactory(final HCodeFactory prevhcf,
 46 andyb    1.1.2.1                                             final Frame frame) {
 47 andyb    1.1.2.3          if (prevhcf.getCodeName().equals(CanonicalTreeCode.codename)) {
 48 andyb    1.1.2.3              return new HCodeFactory() {
 49 andyb    1.1.2.3                  public HCode convert(HMethod m) {
 50 andyb    1.1.2.3                      harpoon.IR.Tree.Code tc =
 51 andyb    1.1.2.3                          (harpoon.IR.Tree.Code) prevhcf.convert(m);
 52 andyb    1.1.2.3                      return (tc == null) ? null : new Code(tc);
 53 andyb    1.1.2.3                  }
 54 andyb    1.1.2.3                  public void clear(HMethod m) { prevhcf.clear(m); }
 55 andyb    1.1.2.3                  public String getCodeName() { return codename; }
 56 andyb    1.1.2.3              };
 57 andyb    1.1.2.3          } else {
 58 andyb    1.1.2.3              return codeFactory(CanonicalTreeCode.codeFactory(prevhcf, frame),
 59 andyb    1.1.2.3                                 frame);
 60 andyb    1.1.2.3          }
 61 andyb    1.1.2.3      }
 62 andyb    1.1.2.1  
 63 andyb    1.1.2.3      private Temp get(Instr i, Temp val) {
 64 andyb    1.1.2.3          return (Temp) tempInstrPairToRegisterMap.get(
 65 andyb    1.1.2.3              new TempInstrPair(i, val));
 66 andyb    1.1.2.1      }
 67 andyb    1.1.2.1  
 68 pnkfelix 1.1.2.9      public String getRegisterName(Instr i, Temp val, String suffix) { 
 69 andyb    1.1.2.3          TempBuilder tb = (TempBuilder) frame.getTempBuilder();
 70 andyb    1.1.2.3          Temp reg = null;
 71 andyb    1.1.2.3          String s = null;
 72 andyb    1.1.2.3  
 73 andyb    1.1.2.3          if (tb.isTwoWord(val)) {
 74 andyb    1.1.2.3              if (suffix.startsWith("l")) {
 75 andyb    1.1.2.3                  reg = get(i, tb.getLow(val));
 76 andyb    1.1.2.3              } else if (suffix.startsWith("h")) {
 77 andyb    1.1.2.3                  reg = get(i, tb.getHigh(val));
 78 andyb    1.1.2.3              } else if (suffix.trim().equals("")) {
 79 cananian 1.3.2.1                  assert false : ("BREAK!  empty suffix \n " +
 80 andyb    1.1.2.10                             "suffix: " + suffix + "\n" +
 81 andyb    1.1.2.10                             "instr: " + i + "\n" + 
 82 andyb    1.1.2.10                             "instr str: " + i.getAssem() + "\n"+
 83 andyb    1.1.2.10                             "temp: " + val);
 84 andyb    1.1.2.3              } else {
 85 cananian 1.3.2.1                  assert false : ("BREAK! Unknown suffix \n" +
 86 andyb    1.1.2.10                             "suffix: " + suffix + "\n" +
 87 andyb    1.1.2.10                             "instr: " + i + "\n" + 
 88 andyb    1.1.2.10                             "instr str: " + i.getAssem() + "\n"+
 89 andyb    1.1.2.10                             "temp: " + val);
 90 andyb    1.1.2.3              }
 91 andyb    1.1.2.3              if (reg != null) {
 92 andyb    1.1.2.3                  s = reg.name() + suffix.substring(1);
 93 andyb    1.1.2.3              } else {
 94 andyb    1.1.2.3                  s = val.name() + suffix;
 95 andyb    1.1.2.3              }
 96 andyb    1.1.2.3          } else {
 97 andyb    1.1.2.3              reg = get(i, val);
 98 andyb    1.1.2.3   
 99 andyb    1.1.2.3              if (reg != null) {
100 andyb    1.1.2.3                  s = reg.name() + suffix;
101 andyb    1.1.2.3              } else {
102 andyb    1.1.2.3                  s = val.name() + suffix;
103 andyb    1.1.2.3              }
104 andyb    1.1.2.3          }
105 andyb    1.1.2.3          return s;
106 andyb    1.1.2.1      }
107 andyb    1.1.2.1  
108 pnkfelix 1.1.2.12     public List getRegisters(Instr i, Temp val) {
109 cananian 1.3.2.1          assert i != null : "Instr was null in Code.getRegisters";
110 andyb    1.1.2.10         TempBuilder tb = (TempBuilder) frame.getTempBuilder();
111 andyb    1.1.2.10         if (tb.isTwoWord(val)) {
112 andyb    1.1.2.10             Temp low = get(i, tb.getLow(val));
113 andyb    1.1.2.10             Temp high = get(i, tb.getHigh(val));
114 cananian 1.3.2.1              assert low != null : "low reg for "+val+" in "+i+" was null";
115 cananian 1.3.2.1              assert high != null : "high reg for "+val+" in "+i+" was null";
116 andyb    1.1.2.10             return Arrays.asList(new Temp[] { low, high });
117 andyb    1.1.2.10         } else {
118 andyb    1.1.2.10             Temp t = get(i, val);
119 cananian 1.3.2.1              assert t != null : "register for "+val+" in "+i+" was null";
120 pnkfelix 1.1.2.12             return Collections.nCopies(1, t);
121 andyb    1.1.2.10         }
122 andyb    1.1.2.10     }
123 andyb    1.1.2.10 
124 andyb    1.1.2.1      public void assignRegister(Instr i, Temp pseudoReg, List regs) { 
125 andyb    1.1.2.3          TempBuilder tb = (TempBuilder) frame.getTempBuilder();
126 andyb    1.1.2.3          if (tb.isTwoWord(pseudoReg)) {
127 andyb    1.1.2.3              tempInstrPairToRegisterMap.put(
128 andyb    1.1.2.3                  new TempInstrPair(i, tb.getLow(pseudoReg)),
129 andyb    1.1.2.3                  regs.get(0));
130 andyb    1.1.2.3              tempInstrPairToRegisterMap.put(
131 andyb    1.1.2.3                  new TempInstrPair(i, tb.getHigh(pseudoReg)),
132 andyb    1.1.2.3                  regs.get(1));
133 andyb    1.1.2.3          } else {
134 andyb    1.1.2.3              tempInstrPairToRegisterMap.put(
135 andyb    1.1.2.3                  new TempInstrPair(i, pseudoReg), 
136 andyb    1.1.2.3                  regs.get(0));
137 andyb    1.1.2.3          }
138 andyb    1.1.2.1      }
139 andyb    1.1.2.10 
140 pnkfelix 1.1.2.4      public boolean registerAssigned(Instr i, Temp pr) {
141 andyb    1.1.2.10         TempBuilder tb = (TempBuilder) frame.getTempBuilder();
142 andyb    1.1.2.10         Set keys = tempInstrPairToRegisterMap.keySet();
143 andyb    1.1.2.10         if (tb.isTwoWord(pr)) {
144 andyb    1.1.2.10             TempInstrPair pair1 = new TempInstrPair(i, tb.getLow(pr));
145 andyb    1.1.2.10             TempInstrPair pair2 = new TempInstrPair(i, tb.getHigh(pr));
146 andyb    1.1.2.10             return (keys.contains(pair1) && keys.contains(pair2));
147 andyb    1.1.2.10         } else {
148 andyb    1.1.2.10             return (keys.contains(new TempInstrPair(i, pr)));
149 andyb    1.1.2.10         }
150 pnkfelix 1.1.2.4      }
151 pnkfelix 1.1.2.4  
152 andyb    1.1.2.10     public void removeAssignment(Instr i, Temp pseudoReg) {
153 andyb    1.1.2.10         TempBuilder tb = (TempBuilder) frame.getTempBuilder();
154 andyb    1.1.2.10         if (tb.isTwoWord(pseudoReg)) {
155 andyb    1.1.2.10             tempInstrPairToRegisterMap.remove(
156 andyb    1.1.2.10                 new TempInstrPair(i, tb.getLow(pseudoReg)));
157 andyb    1.1.2.10             tempInstrPairToRegisterMap.remove(
158 andyb    1.1.2.10                 new TempInstrPair(i, tb.getHigh(pseudoReg)));
159 andyb    1.1.2.10         } else {
160 andyb    1.1.2.10             tempInstrPairToRegisterMap.remove(
161 andyb    1.1.2.10                 new TempInstrPair(i, pseudoReg));
162 andyb    1.1.2.10         }
163 andyb    1.1.2.10     }
164 cananian 1.2      }