1 cananian 1.1.2.1 // LQop.java, created Wed Jan 20 23:28:15 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 /**
 8 cananian 1.1.2.1  * <code>LQop</code> is an enumerated type for the various kinds of
 9 cananian 1.1.2.1  * <code>OPER</code> opcodes in <code>LowQuad</code> form.
10 cananian 1.1.2.1  * 
11 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
12 cananian 1.2      * @version $Id: LQop.java,v 1.2 2002/02/25 21:04:38 cananian Exp $
13 cananian 1.1.2.1  */
14 cananian 1.1.2.1 public abstract class LQop extends harpoon.IR.Quads.Qop {
15 cananian 1.1.2.1     
16 cananian 1.1.2.1     /** Evaluates to <code>true</code> if the two <code>POINTER</code>
17 cananian 1.1.2.1      *  values are equal. */
18 cananian 1.1.2.1     public final static int PCMPEQ = 100;
19 cananian 1.1.2.1     /** Evaluates to <code>true</code> if the first <code>POINTER</code>
20 cananian 1.1.2.1      *  value is greater than the second <code>POINTER</code> value. */
21 cananian 1.1.2.1     public final static int PCMPGT = 101;
22 cananian 1.1.2.1     /** Computes the sum of two <code>POINTER</code> values. */
23 cananian 1.1.2.1     public final static int PADD = 102;
24 cananian 1.1.2.2     /** Negates a <code>POINTER</code> value (used to compute differences). */
25 cananian 1.1.2.2     public final static int PNEG = 103;
26 cananian 1.1.2.1 
27 cananian 1.1.2.1     public static boolean isValid(int v) {
28 cananian 1.1.2.1         return harpoon.IR.Quads.Qop.isValid(v) ||
29 cananian 1.1.2.1             ((100<=v) && (v<=103));
30 cananian 1.1.2.1     }
31 cananian 1.1.2.1 
32 cananian 1.1.2.1     public static String toString(int v) {
33 cananian 1.1.2.1         switch(v) {
34 cananian 1.1.2.1         case PCMPEQ: return "pcmpeq";
35 cananian 1.1.2.1         case PCMPGT: return "pcmpgt";
36 cananian 1.1.2.1         case PADD:   return "padd";
37 cananian 1.1.2.2         case PNEG:   return "pneg";
38 cananian 1.1.2.1         default:     return harpoon.IR.Quads.Qop.toString(v);
39 cananian 1.1.2.1         }
40 cananian 1.1.2.1     }
41 cananian 1.1.2.1     public static int forString(String op) {
42 cananian 1.1.2.1         Integer r = (Integer) h.get(op);
43 cananian 1.1.2.1         if (r==null) return harpoon.IR.Quads.Qop.forString(op);
44 cananian 1.1.2.1         else return r.intValue();
45 cananian 1.1.2.1     }
46 cananian 1.1.2.1     private static final java.util.Hashtable h = new java.util.Hashtable();
47 cananian 1.1.2.1     static {
48 cananian 1.1.2.1         h.put("pcmpeq", new Integer(PCMPEQ));
49 cananian 1.1.2.1         h.put("pcmpgt", new Integer(PCMPGT));
50 cananian 1.1.2.1         h.put("padd", new Integer(PADD));
51 cananian 1.1.2.2         h.put("pneg", new Integer(PNEG));
52 cananian 1.1.2.1     }
53 cananian 1.1.2.1 
54 cananian 1.1.2.1     /** Determines the result type of an <code>OPER</code>. */
55 cananian 1.1.2.1     public static HClass resultType(int v) {
56 cananian 1.1.2.1         switch(v) {
57 cananian 1.1.2.1         case PCMPEQ:
58 cananian 1.1.2.1         case PCMPGT:
59 cananian 1.1.2.1             return HClass.Boolean;
60 cananian 1.1.2.1         case PADD:
61 cananian 1.1.2.2         case PNEG:
62 cananian 1.1.2.1             throw new Error("I've no idea what to return in this case.");
63 cananian 1.1.2.1         default:
64 cananian 1.1.2.1             return harpoon.IR.Quads.Qop.resultType(v);
65 cananian 1.1.2.1         }
66 cananian 1.1.2.1     }
67 cananian 1.1.2.1     /** Evaluates a constant value for the result of an <code>OPER</code>,
68 cananian 1.1.2.1      *  given constant values for the operands. */
69 cananian 1.1.2.1     public static Object evaluation(int opc, Object[] opd) {
70 cananian 1.1.2.1         switch(opc) {
71 cananian 1.1.2.1         case PCMPEQ:
72 cananian 1.1.2.1         case PCMPGT:
73 cananian 1.1.2.1         case PADD:
74 cananian 1.1.2.2         case PNEG:
75 cananian 1.1.2.1             throw new Error("No idea how to handle these.");
76 cananian 1.1.2.1         default:
77 cananian 1.1.2.1             return harpoon.IR.Quads.Qop.evaluate(opc, opd);
78 cananian 1.1.2.1         }
79 cananian 1.1.2.1     }
80 cananian 1.1.2.1 }
81 cananian 1.1.2.1 
82 cananian 1.2