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 }