1 cananian 1.1.2.1 // CJMP.java, created Wed Aug 5 07:07:32 1998 by cananian 2 cananian 1.1.2.1 // Copyright (C) 1998 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.IR.Quads; 5 cananian 1.1.2.1 6 cananian 1.1.2.8 import harpoon.ClassFile.HCodeElement; 7 cananian 1.1.2.1 import harpoon.Temp.Temp; 8 cananian 1.1.2.1 import harpoon.Temp.TempMap; 9 cananian 1.1.2.2 import harpoon.Util.Util; 10 cananian 1.1.2.2 11 cananian 1.1.2.1 /** 12 cananian 1.1.2.9 * <code>CJMP</code> represents conditional branches. <p> 13 cananian 1.1.2.1 * <code>next[0]</code> is if-false, which is taken if 14 cananian 1.1.2.1 * the operand is equal to zero. 15 cananian 1.1.2.1 * <code>next[1]</code> is if-true branch, taken when 16 cananian 1.1.2.1 * the operand is not equal to zero. 17 cananian 1.1.2.1 * 18 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 19 cananian 1.5 * @version $Id: CJMP.java,v 1.5 2002/04/11 04:00:34 cananian Exp $ 20 cananian 1.1.2.1 */ 21 cananian 1.1.2.1 public class CJMP extends SIGMA { 22 cananian 1.1.2.2 protected Temp test; 23 cananian 1.1.2.1 24 cananian 1.1.2.2 /** Creates a <code>CJMP</code> representing a conditional branch. 25 cananian 1.1.2.2 * @param test 26 cananian 1.1.2.2 * the <code>Temp</code> tested by this branch. 27 cananian 1.1.2.2 * @param src 28 cananian 1.1.2.2 * the source <code>Temp</code>s for the underlying 29 cananian 1.1.2.2 * <code>SIGMA</code>. 30 cananian 1.1.2.2 * @param dst 31 cananian 1.1.2.2 * the destination <code>Temp</code>s for the underlying 32 cananian 1.1.2.2 * <code>SIGMA</code>. 33 cananian 1.1.2.2 */ 34 cananian 1.1.2.4 public CJMP(QuadFactory qf, HCodeElement source, 35 cananian 1.1.2.4 Temp test, Temp dst[][], Temp src[]) { 36 cananian 1.1.2.4 super(qf, source, dst, src, 2 /* two branch targets */); 37 cananian 1.1.2.1 this.test = test; 38 cananian 1.3.2.1 assert test!=null; 39 cananian 1.1.2.1 } 40 cananian 1.1.2.2 /** Creates a <code>CJMP</code> representing a conditional branch. 41 cananian 1.1.2.2 * Abbreviated form of the constructor uses an appropriately-sized 42 cananian 1.1.2.2 * array of <code>null</code> values for the <code>dst</code> field. 43 cananian 1.1.2.2 */ 44 cananian 1.1.2.4 public CJMP(QuadFactory qf, HCodeElement source, Temp test, Temp src[]) { 45 cananian 1.1.2.4 this(qf, source, test, new Temp[src.length][2], src); 46 cananian 1.1.2.1 } 47 cananian 1.1.2.2 // ACCESSOR FUNCTIONS: 48 cananian 1.1.2.2 /** Returns the <code>Temp</code> tested by this <code>CJMP</code>. */ 49 cananian 1.1.2.2 public Temp test() { return test; } 50 cananian 1.1.2.1 51 cananian 1.1.2.6 /** Returns all the <code>Temp</code>s used by this Quad. 52 cananian 1.1.2.1 * @return the <code>test</code> field. 53 cananian 1.1.2.1 */ 54 cananian 1.1.2.1 public Temp[] use() { 55 cananian 1.1.2.1 Temp[] u = super.use(); 56 cananian 1.1.2.1 Temp[] r = new Temp[u.length+1]; 57 cananian 1.1.2.1 System.arraycopy(u, 0, r, 0, u.length); 58 cananian 1.1.2.1 // add 'test' to end of use array. 59 cananian 1.1.2.1 r[u.length] = test; 60 cananian 1.1.2.1 return r; 61 cananian 1.1.2.1 } 62 cananian 1.1.2.1 63 cananian 1.1.2.3 public int kind() { return QuadKind.CJMP; } 64 cananian 1.1.2.3 65 cananian 1.1.2.7 public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) { 66 cananian 1.1.2.7 return new CJMP(qqf, this, map(useMap, test), map(defMap, dst), 67 cananian 1.1.2.7 map(useMap, src)); 68 cananian 1.1.2.3 } 69 cananian 1.1.2.7 /** Rename all used variables in this Quad according to a mapping. 70 cananian 1.1.2.7 * @deprecated does not preserve immutability. */ 71 cananian 1.1.2.3 void renameUses(TempMap tm) { 72 cananian 1.1.2.1 super.renameUses(tm); 73 cananian 1.1.2.1 test = tm.tempMap(test); 74 cananian 1.1.2.1 } 75 cananian 1.1.2.7 /** Rename all defined variables in this Quad according to a mapping. 76 cananian 1.1.2.7 * @deprecated does not preserve immutability. */ 77 cananian 1.1.2.3 void renameDefs(TempMap tm) { 78 cananian 1.1.2.1 super.renameDefs(tm); 79 cananian 1.1.2.1 } 80 cananian 1.1.2.1 81 cananian 1.1.2.10 public void accept(QuadVisitor v) { v.visit(this); } 82 cananian 1.5 public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); } 83 cananian 1.1.2.1 84 cananian 1.1.2.1 /** Returns human-readable representation. */ 85 cananian 1.1.2.1 public String toString() { 86 cananian 1.1.2.1 return "CJMP: if " + test + 87 cananian 1.1.2.1 " / " + super.toString(); 88 cananian 1.1.2.1 } 89 cananian 1.2 }