1 cananian 1.1.2.1 // Code.java, created Wed Oct 20 12:58:47 1999 by cananian 2 cananian 1.1.2.1 // Copyright (C) 1999 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1.2.1 package harpoon.Backend.CSAHack.RegAlloc; 5 cananian 1.1.2.1 6 cananian 1.1.2.6 import harpoon.Analysis.Maps.Derivation; 7 cananian 1.1.2.1 import harpoon.Backend.Generic.Frame; 8 cananian 1.1.2.1 import harpoon.Backend.StrongARM.TwoWordTemp; 9 cananian 1.1.2.1 import harpoon.ClassFile.HCode; 10 cananian 1.1.2.1 import harpoon.ClassFile.HCodeElement; 11 cananian 1.1.2.1 import harpoon.ClassFile.HMethod; 12 cananian 1.1.2.1 import harpoon.IR.Assem.Instr; 13 cananian 1.1.2.1 import harpoon.IR.Assem.InstrFactory; 14 cananian 1.1.2.1 import harpoon.IR.Assem.InstrMEM; 15 cananian 1.1.2.1 import harpoon.Temp.Temp; 16 cananian 1.1.2.1 import harpoon.Temp.TempMap; 17 cananian 1.1.2.1 18 cananian 1.1.2.1 import java.util.Collections; 19 cananian 1.1.2.1 import java.util.HashSet; 20 cananian 1.1.2.1 import java.util.List; 21 cananian 1.1.2.1 import java.util.Set; 22 cananian 1.1.2.1 /** 23 cananian 1.1.2.1 * <code>Code</code> 24 cananian 1.1.2.1 * 25 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 26 cananian 1.2 * @version $Id: Code.java,v 1.2 2002/02/25 21:01:14 cananian Exp $ 27 cananian 1.1.2.1 */ 28 cananian 1.1.2.4 public class Code extends harpoon.IR.Assem.Code { 29 cananian 1.1.2.7 DerivationGenerator dg; 30 cananian 1.1.2.1 TempMap tm; 31 cananian 1.1.2.1 32 cananian 1.1.2.1 /** Creates a <code>Code</code>. */ 33 cananian 1.1.2.6 public Code(final HMethod parent, final Instr instrs, 34 cananian 1.1.2.6 final Derivation deriv, final Frame frame) 35 cananian 1.1.2.1 { 36 cananian 1.1.2.4 super(parent, frame); 37 cananian 1.1.2.6 // XXX: should clone instrs and deriv here. 38 cananian 1.1.2.6 this.instrs = instrs; 39 cananian 1.1.2.7 this.dg = (deriv==null)? null :new DerivationGenerator(instrs, deriv); 40 cananian 1.1.2.7 this.dg = null; // XXX SPILLING DERIVED POINTERS IS BROKEN. 41 cananian 1.1.2.7 RegAlloc ra = new RegAlloc(frame, this, instrs, dg); 42 cananian 1.1.2.1 this.tm = ra; 43 cananian 1.1.2.1 this.instrs = frame.getCodeGen().procFixup(parent, instrs, locals, 44 cananian 1.1.2.1 computeUsedRegs(instrs)); 45 cananian 1.1.2.1 } 46 cananian 1.1.2.7 public Derivation getDerivation() { return dg; } 47 cananian 1.1.2.1 private Set computeUsedRegs(Instr instrs) { 48 cananian 1.1.2.1 Set s = new HashSet(); 49 cananian 1.1.2.1 for (Instr il = instrs; il!=null; il=il.getNext()) { 50 cananian 1.1.2.1 Temp[] d = il.def(); 51 cananian 1.1.2.1 for (int i=0; i<d.length; i++) 52 cananian 1.1.2.1 if (d[i] instanceof TwoWordTemp) { 53 cananian 1.1.2.1 s.add(tm.tempMap(((TwoWordTemp)d[i]).getLow())); 54 cananian 1.1.2.1 s.add(tm.tempMap(((TwoWordTemp)d[i]).getHigh())); 55 cananian 1.1.2.1 } else s.add(tm.tempMap(d[i])); 56 cananian 1.1.2.1 } 57 cananian 1.1.2.1 return Collections.unmodifiableSet(s); 58 cananian 1.1.2.1 } 59 cananian 1.1.2.1 60 cananian 1.1.2.1 public String getName() { return "hacked-regalloc"; } 61 pnkfelix 1.1.2.5 public String getRegisterName(Instr i, Temp val, String suffix) { 62 cananian 1.1.2.1 if (val instanceof TwoWordTemp) { 63 cananian 1.1.2.1 if (suffix.equals("l")) 64 cananian 1.1.2.1 return tm.tempMap(((TwoWordTemp)val).getLow()).toString(); 65 cananian 1.1.2.1 if (suffix.equals("h")) 66 cananian 1.1.2.1 return tm.tempMap(((TwoWordTemp)val).getHigh()).toString(); 67 cananian 1.1.2.2 throw new Error("Unknown suffix: \""+suffix+"\" in "+i); 68 cananian 1.1.2.1 } 69 cananian 1.1.2.1 return tm.tempMap(val).toString(); 70 cananian 1.1.2.1 } 71 cananian 1.1.2.1 public void assignRegister(Instr i, Temp pr, List regs) { 72 pnkfelix 1.1.2.3 throw new Error("unimplemented"); 73 pnkfelix 1.1.2.3 } 74 pnkfelix 1.1.2.3 public boolean registerAssigned(Instr i, Temp pr) { 75 cananian 1.1.2.1 throw new Error("unimplemented"); 76 cananian 1.1.2.1 } 77 cananian 1.1.2.1 78 cananian 1.1.2.1 Access allocLocal() { 79 cananian 1.1.2.8 final Temp FP = frame.getRegFileInfo().getRegister(11); 80 cananian 1.1.2.1 final int n = locals++; 81 cananian 1.1.2.1 return new Access() { 82 cananian 1.1.2.1 public Instr makeLoad(InstrFactory inf, HCodeElement source, 83 cananian 1.1.2.1 Temp dst) { 84 cananian 1.1.2.1 return new InstrMEM(inf, source, 85 cananian 1.1.2.8 "ldr `d0, [`s0, #.fpoffset-"+(n*4)+"] @ spill", 86 cananian 1.1.2.8 new Temp[] { dst }, new Temp[]{ FP }); 87 cananian 1.1.2.1 } 88 cananian 1.1.2.1 public Instr makeStore(InstrFactory inf, HCodeElement source, 89 cananian 1.1.2.1 Temp src) { 90 cananian 1.1.2.1 return new InstrMEM(inf, source, 91 cananian 1.1.2.8 "str `s0, [`s1, #.fpoffset-"+(n*4)+"] @ spill", 92 cananian 1.1.2.8 null, new Temp[]{ src, FP }); 93 cananian 1.1.2.1 } 94 cananian 1.1.2.1 }; 95 cananian 1.1.2.1 } 96 cananian 1.1.2.1 private int locals=0; 97 cananian 1.1.2.1 98 cananian 1.1.2.1 abstract class Access { 99 cananian 1.1.2.1 public abstract Instr makeLoad(InstrFactory inf, HCodeElement source, 100 cananian 1.1.2.1 Temp dst); 101 cananian 1.1.2.1 public abstract Instr makeStore(InstrFactory inf, HCodeElement source, 102 cananian 1.1.2.1 Temp src); 103 cananian 1.1.2.1 } 104 cananian 1.2 }