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