1 cananian 1.1.2.1 // OPER.java, created Wed Aug 5 06:47:58 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.1 import java.lang.reflect.Method;
7 cananian 1.1.2.1 import java.lang.reflect.InvocationTargetException;
8 cananian 1.1.2.1 import java.util.Hashtable;
9 cananian 1.1.2.1
10 cananian 1.1.2.1 import harpoon.Analysis.Maps.ConstMap;
11 cananian 1.1.2.10 import harpoon.ClassFile.HClass;
12 cananian 1.1.2.10 import harpoon.ClassFile.HCodeElement;
13 cananian 1.1.2.1 import harpoon.Temp.Temp;
14 cananian 1.1.2.1 import harpoon.Temp.TempMap;
15 cananian 1.1.2.1 import harpoon.Util.Util;
16 cananian 1.1.2.3
17 cananian 1.1.2.1 /**
18 cananian 1.1.2.1 * <code>OPER</code> objects represent arithmetic/logical operations,
19 cananian 1.1.2.1 * including mathematical operators such as add and subtract,
20 cananian 1.1.2.1 * conversion operators such as double-to-int, and comparison
21 cananian 1.1.2.1 * operators such as greater than and equals.
22 cananian 1.1.2.1 * <p>
23 cananian 1.1.2.1 * <code>OPER</code> quads never throw exceptions. Any exception thrown
24 cananian 1.1.2.1 * implicitly by the java bytecode opcode corresponding to an OPER is
25 cananian 1.1.2.1 * rewritten as an explicit test and throw in the Quad IR.
26 cananian 1.1.2.1 *
27 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu>
28 cananian 1.5 * @version $Id: OPER.java,v 1.5 2002/04/11 04:00:34 cananian Exp $
29 cananian 1.1.2.1 */
30 cananian 1.1.2.1 public class OPER extends Quad {
31 cananian 1.1.2.3 /** The <code>Temp</code> in which to store the result of the operation. */
32 cananian 1.1.2.3 protected Temp dst;
33 cananian 1.1.2.1 /** The operation to be performed, from the <code>Qop</code> class. */
34 cananian 1.1.2.3 final protected int opcode;
35 cananian 1.1.2.1 /** Operands of the operation, in left-to-right order. */
36 cananian 1.1.2.3 protected Temp[] operands;
37 cananian 1.1.2.1 /** Creates a <code>OPER</code>. */
38 cananian 1.1.2.5 public OPER(QuadFactory qf, HCodeElement source,
39 cananian 1.1.2.1 int opcode, Temp dst, Temp[] operands) {
40 cananian 1.1.2.5 super(qf, source);
41 cananian 1.1.2.1 this.opcode = opcode;
42 cananian 1.1.2.1 this.dst = dst;
43 cananian 1.1.2.1 this.operands = operands;
44 cananian 1.1.2.3 // VERIFY legality of OPER.
45 cananian 1.3.2.1 assert dst!=null && operands!=null;
46 cananian 1.1.2.9 if (kind()==QuadKind.OPER) // allow subclassing.
47 cananian 1.3.2.1 assert Qop.isValid(opcode);
48 cananian 1.1.2.3 for (int i=0; i<operands.length; i++)
49 cananian 1.3.2.1 assert operands[i]!=null;
50 cananian 1.1.2.1 }
51 cananian 1.1.2.3 // ACCESSOR METHODS:
52 cananian 1.1.2.3 /** Returns the <code>Temp</code> in which to store the result of the
53 cananian 1.1.2.3 * operation. */
54 cananian 1.1.2.3 public Temp dst() { return dst; }
55 cananian 1.1.2.3 /** Returns the operation to be performed, as an integer enumeration
56 cananian 1.1.2.3 * from the <code>Qop</code> class. */
57 cananian 1.1.2.3 public int opcode() { return opcode; }
58 cananian 1.1.2.3 /** Returns an array of <code>Temp</code>s which are the operands
59 cananian 1.1.2.3 * of the operation. */
60 cananian 1.1.2.3 public Temp[] operands()
61 cananian 1.1.2.3 { return (Temp[]) Util.safeCopy(Temp.arrayFactory, operands); }
62 cananian 1.1.2.3 /** Returns a specified element of the <code>operands</code> array. */
63 cananian 1.1.2.3 public Temp operands(int i) { return operands[i]; }
64 cananian 1.1.2.3 /** Returns the length of the <code>operands</code> array. */
65 cananian 1.1.2.3 public int operandsLength() { return operands.length; }
66 cananian 1.1.2.1
67 cananian 1.1.2.1 /** Returns the Temps used by this OPER. */
68 cananian 1.1.2.2 public Temp[] use()
69 cananian 1.1.2.2 { return (Temp[]) Util.safeCopy(Temp.arrayFactory, operands); }
70 cananian 1.1.2.1 /** Returns the Temps defined by this OPER. */
71 cananian 1.1.2.1 public Temp[] def() { return new Temp[] { dst }; }
72 cananian 1.1.2.1
73 cananian 1.1.2.4 public int kind() { return QuadKind.OPER; }
74 cananian 1.1.2.4
75 cananian 1.1.2.6 public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) {
76 cananian 1.1.2.6 return new OPER(qqf, this,
77 cananian 1.1.2.6 opcode, map(defMap,dst), map(useMap,operands));
78 cananian 1.1.2.4 }
79 cananian 1.1.2.6 /** Rename all used variables in this Quad according to a mapping.
80 cananian 1.1.2.6 * @deprecated does not preserve immutability. */
81 cananian 1.1.2.4 void renameUses(TempMap tm) {
82 cananian 1.1.2.1 for (int i=0; i<operands.length; i++)
83 cananian 1.1.2.1 operands[i] = tm.tempMap(operands[i]);
84 cananian 1.1.2.1 }
85 cananian 1.1.2.6 /** Rename all defined variables in this Quad according to a mapping.
86 cananian 1.1.2.6 * @deprecated does not preserve immutability. */
87 cananian 1.1.2.4 void renameDefs(TempMap tm) {
88 cananian 1.1.2.1 dst = tm.tempMap(dst);
89 cananian 1.1.2.1 }
90 cananian 1.1.2.1
91 cananian 1.1.2.11 public void accept(QuadVisitor v) { v.visit(this); }
92 cananian 1.5 public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); }
93 cananian 1.1.2.11 public void accept(OperVisitor v) { v.dispatch(this); }
94 cananian 1.1.2.1
95 cananian 1.1.2.1 /** Returns a human-readable representation of this Quad. */
96 cananian 1.1.2.1 public String toString() {
97 cananian 1.1.2.1 StringBuffer sb = new StringBuffer(dst.toString());
98 cananian 1.1.2.1 sb.append(" = OPER " + Qop.toString(opcode) + "(");
99 cananian 1.1.2.1 for (int i=0; i<operands.length; i++) {
100 cananian 1.1.2.1 sb.append(operands[i].toString());
101 cananian 1.1.2.1 if (i<operands.length-1)
102 cananian 1.1.2.1 sb.append(", ");
103 cananian 1.1.2.1 }
104 cananian 1.1.2.1 sb.append(')');
105 cananian 1.1.2.1 return sb.toString();
106 cananian 1.1.2.1 }
107 cananian 1.1.2.1
108 cananian 1.1.2.1 // -------------------------------------------------------
109 cananian 1.1.2.1 // Evaluation functions.
110 cananian 1.1.2.1
111 cananian 1.1.2.1 /** Determines the result type of an <code>OPER</code>. */
112 cananian 1.1.2.1 public HClass evalType() {
113 cananian 1.1.2.8 return Qop.resultType(opcode);
114 cananian 1.1.2.1 }
115 cananian 1.1.2.8
116 cananian 1.1.2.1 /** Evaluates a constant value for the result of an <code>OPER</code>,
117 cananian 1.1.2.1 * given constant values for the operands. */
118 cananian 1.1.2.8 public Object evalValue(Object[] opvalues) {
119 cananian 1.1.2.8 return Qop.evaluate(opcode, opvalues);
120 cananian 1.1.2.1 }
121 cananian 1.2 }