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      }