1 cananian 1.1.2.1 // POPER.java, created Wed Jan 20 23:39:35 1999 by cananian
 2 cananian 1.1.2.1 // Copyright (C) 1999 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.LowQuad;
 5 cananian 1.1.2.1 
 6 cananian 1.1.2.1 import harpoon.ClassFile.HClass;
 7 cananian 1.1.2.1 import harpoon.ClassFile.HCodeElement;
 8 cananian 1.1.2.1 import harpoon.Temp.Temp;
 9 cananian 1.1.2.1 import harpoon.Temp.TempMap;
10 cananian 1.1.2.1 import harpoon.Util.Util;
11 cananian 1.1.2.1 /**
12 cananian 1.1.2.1  * <code>POPER</code> is an extended version of
13 cananian 1.1.2.2  * <code>harpoon.IR.Quads.OPER</code>, with new opcodes defined in
14 cananian 1.1.2.2  * <code>LQop</code>.
15 cananian 1.1.2.1  * 
16 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
17 cananian 1.4      * @version $Id: POPER.java,v 1.4 2002/04/10 03:04:57 cananian Exp $
18 cananian 1.1.2.1  */
19 cananian 1.1.2.1 public class POPER extends harpoon.IR.Quads.OPER {
20 cananian 1.1.2.1     
21 cananian 1.1.2.1     /** Creates a <code>POPER</code>. */
22 cananian 1.1.2.1     public POPER(LowQuadFactory qf, HCodeElement source, 
23 cananian 1.1.2.1                  int opcode, Temp dst, Temp[] operands) {
24 cananian 1.1.2.1         super(qf, source, opcode, dst, operands);
25 cananian 1.1.2.1         if (kind()==LowQuadKind.POPER) // allow subclassing
26 cananian 1.3.2.1             assert LQop.isValid(opcode);
27 cananian 1.1.2.1     }
28 cananian 1.1.2.1     public int kind() { return LowQuadKind.POPER; }
29 cananian 1.1.2.1 
30 cananian 1.1.2.1     public harpoon.IR.Quads.Quad rename(harpoon.IR.Quads.QuadFactory qf,
31 cananian 1.1.2.1                                         TempMap defMap, TempMap useMap) {
32 cananian 1.1.2.1         return new POPER((LowQuadFactory)qf, this, opcode,
33 cananian 1.1.2.1                          map(defMap, dst), map(useMap, operands));
34 cananian 1.1.2.1     }
35 cananian 1.1.2.1 
36 cananian 1.1.2.3     public void accept(harpoon.IR.Quads.QuadVisitor v) {
37 cananian 1.1.2.1         ((LowQuadVisitor)v).visit(this);
38 cananian 1.1.2.1     }
39 cananian 1.1.2.1 
40 cananian 1.1.2.1     /** Returns a human-readable representation of this Quad. */
41 cananian 1.1.2.1     public String toString() {
42 cananian 1.1.2.1         StringBuffer sb = new StringBuffer(dst.toString());
43 cananian 1.1.2.1         sb.append(" = POPER " + LQop.toString(opcode) + "(");
44 cananian 1.1.2.1         for (int i=0; i<operands.length; i++) {
45 cananian 1.1.2.1             sb.append(operands[i].toString());
46 cananian 1.1.2.1             if (i<operands.length-1)
47 cananian 1.1.2.1                 sb.append(", ");
48 cananian 1.1.2.1         }
49 cananian 1.1.2.1         sb.append(')');
50 cananian 1.1.2.1         return sb.toString();
51 cananian 1.1.2.1     }
52 cananian 1.1.2.1 
53 cananian 1.1.2.1     // -------------------------------------------------------
54 cananian 1.1.2.1     //   Evaluation functions.
55 cananian 1.1.2.1 
56 cananian 1.1.2.1     /** Determines the result type of an <code>OPER</code>. */
57 cananian 1.1.2.1     public HClass evalType() {
58 cananian 1.1.2.1         return LQop.resultType(opcode);
59 cananian 1.1.2.1     }
60 cananian 1.1.2.1 
61 cananian 1.1.2.1     /** Evaluates a constant value for the result of an <code>OPER</code>, 
62 cananian 1.1.2.1      *  given constant values for the operands. */
63 cananian 1.1.2.1     public Object evalValue(Object[] opvalues) { 
64 cananian 1.1.2.1         return LQop.evaluate(opcode, opvalues);
65 cananian 1.1.2.1     }
66 cananian 1.2     }