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     }