1 cananian 1.1.2.7 // InstrBuilder.java, created Tue Nov  2  2:07:04 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.1 import harpoon.IR.Assem.Instr;
 7 andyb    1.1.2.1 import harpoon.IR.Assem.InstrLABEL;
 8 andyb    1.1.2.3 import harpoon.IR.Assem.InstrMEM;
 9 andyb    1.1.2.3 import harpoon.Temp.Label;
10 andyb    1.1.2.1 import harpoon.Temp.Temp;
11 andyb    1.1.2.1 
12 andyb    1.1.2.4 import java.util.Arrays;
13 andyb    1.1.2.1 import java.util.List;
14 andyb    1.1.2.1 
15 andyb    1.1.2.1 /**
16 andyb    1.1.2.1  * <code>Sparc.InstrBuilder</code> is another implementation of
17 andyb    1.1.2.1  * <code>Generic.InstrBuilder</code> - for the Sparc architecture.
18 andyb    1.1.2.1  *
19 andyb    1.1.2.1  * @author  Andrew Berkheimer <andyb@mit.edu>
20 cananian 1.2      * @version $Id: InstrBuilder.java,v 1.2 2002/02/25 21:02:37 cananian Exp $
21 andyb    1.1.2.1  */
22 andyb    1.1.2.1 public class InstrBuilder extends harpoon.Backend.Generic.InstrBuilder {
23 andyb    1.1.2.2     private final RegFileInfo regFileInfo;
24 andyb    1.1.2.2     private final TempBuilder tempBuilder;
25 andyb    1.1.2.1 
26 andyb    1.1.2.1     InstrBuilder(RegFileInfo regFileInfo, TempBuilder tempBuilder) {
27 andyb    1.1.2.3         super();
28 andyb    1.1.2.3         this.regFileInfo = regFileInfo;
29 andyb    1.1.2.3         this.tempBuilder = tempBuilder;
30 andyb    1.1.2.1     }
31 andyb    1.1.2.1 
32 andyb    1.1.2.1     public List makeLoad(Temp r, int offset, Instr template) {
33 andyb    1.1.2.3         if (tempBuilder.isTwoWord(r)) {
34 andyb    1.1.2.6             InstrMEM load = 
35 andyb    1.1.2.6                 new InstrMEM(template.getFactory(), template,
36 andyb    1.1.2.6                              "ldd [`s0 + " +(-4*(offset+1)) + "], `d0h",
37 andyb    1.1.2.6                              new Temp[] { r },
38 andyb    1.1.2.6                              new Temp[] { regFileInfo.SP() });
39 andyb    1.1.2.6             return Arrays.asList(new InstrMEM[] { load, load });
40 andyb    1.1.2.3         } else {
41 andyb    1.1.2.4             InstrMEM load = 
42 andyb    1.1.2.4                 new InstrMEM(template.getFactory(), template,
43 andyb    1.1.2.4                              "ld [`s0 + " + (-4*offset) + "], `d0",
44 andyb    1.1.2.4                              new Temp[] { r },
45 andyb    1.1.2.4                              new Temp[] { regFileInfo.SP() });
46 andyb    1.1.2.4             return Arrays.asList(new InstrMEM[] { load });
47 andyb    1.1.2.3         }
48 andyb    1.1.2.1     }
49 andyb    1.1.2.1 
50 andyb    1.1.2.1     public List makeStore(Temp r, int offset, Instr template) {
51 andyb    1.1.2.3         if (tempBuilder.isTwoWord(r)) {
52 andyb    1.1.2.6             InstrMEM store = 
53 andyb    1.1.2.4                 new InstrMEM(template.getFactory(), template,
54 andyb    1.1.2.6                              "std `s0h, [`s1 + " + (-4*(offset+1)) + "]",
55 andyb    1.1.2.6                              null, new Temp[] { r, regFileInfo.SP() });
56 andyb    1.1.2.6             return Arrays.asList(new InstrMEM[] { store });
57 andyb    1.1.2.3         } else {
58 andyb    1.1.2.4             InstrMEM store =
59 andyb    1.1.2.4                 new InstrMEM(template.getFactory(), template,
60 andyb    1.1.2.4                              "st `s0, [`s1 + " + (-4*offset) + "]",
61 andyb    1.1.2.6                              null, new Temp[] { r, regFileInfo.SP() });
62 andyb    1.1.2.4             return Arrays.asList(new InstrMEM[] { store });
63 andyb    1.1.2.3         }
64 andyb    1.1.2.3     }    
65 andyb    1.1.2.1 
66 andyb    1.1.2.1     public InstrLABEL makeLabel(Instr template) {
67 andyb    1.1.2.3         Label l = new Label();
68 andyb    1.1.2.3         InstrLABEL il = new InstrLABEL(template.getFactory(), template,
69 andyb    1.1.2.3                                        l.toString() + ":", l);
70 andyb    1.1.2.3         return il;
71 andyb    1.1.2.1     }
72 cananian 1.2     }