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 }