1 cananian 1.1.2.1 // PSET.java, created Wed Jan 20 21:47:52 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.3 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 /**
13 cananian 1.1.2.1  * <code>PSET</code> represents a <code>POINTER</code> dereference to
14 cananian 1.1.2.1  * set a field or array element.  The <code>ptr</code> <code>Temp</code>
15 cananian 1.1.2.1  * ought to contain a <code>POINTER</code> value.
16 cananian 1.1.2.1  * 
17 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
18 cananian 1.5      * @version $Id: PSET.java,v 1.5 2002/04/11 04:00:21 cananian Exp $
19 cananian 1.1.2.1  */
20 cananian 1.1.2.1 public class PSET extends LowQuad {
21 cananian 1.1.2.1     /** <code>Temp</code> holding the <code>POINTER</code> value to
22 cananian 1.1.2.3      * dereference and store to. */
23 cananian 1.1.2.1     protected final Temp ptr;
24 cananian 1.1.2.1     /** <code>Temp</code> containing the desired new value of the
25 cananian 1.1.2.1      *  field or element. */
26 cananian 1.1.2.1     protected final Temp src;
27 cananian 1.1.2.3     /** The type of the object we are storing.  This may be
28 cananian 1.1.2.3      *  a sub-integer type, and thus disagree with the type of
29 cananian 1.1.2.3      *  <code>src</code>.  For non-primitive types, this may be
30 cananian 1.1.2.3      *  simply <code>Object</code>; use a typemap and the <code>src</code>
31 cananian 1.1.2.3      *  field if you need accurate non-primitive types. */
32 cananian 1.1.2.3     protected final HClass type;
33 cananian 1.1.2.1     
34 cananian 1.1.2.1     /** Creates a <code>PSET</code> representing a pointer dereference and
35 cananian 1.1.2.1      *  store.
36 cananian 1.1.2.1      * @param ptr
37 cananian 1.1.2.1      *        the <code>Temp</code> holding the <code>POINTER</code> value
38 cananian 1.1.2.1      *        to dereference.
39 cananian 1.1.2.1      * @param src
40 cananian 1.1.2.1      *        the <code>Temp</code> containing the value to put into the
41 cananian 1.1.2.1      *        field or element.
42 cananian 1.1.2.3      * @param type
43 cananian 1.1.2.3      *        the type of the object we are storing; possibly a sub-integer
44 cananian 1.1.2.3      *        type.  Not necessarily precise if non-primitive.
45 cananian 1.1.2.1      */
46 cananian 1.1.2.3     public PSET(LowQuadFactory qf, HCodeElement source,
47 cananian 1.1.2.3                 Temp ptr, Temp src, HClass type) {
48 cananian 1.1.2.1         super(qf, source);
49 cananian 1.1.2.1         this.ptr = ptr;
50 cananian 1.1.2.1         this.src = src;
51 cananian 1.1.2.3         this.type= type;
52 cananian 1.3.2.1         assert ptr!=null && src!=null && type!=null;
53 cananian 1.1.2.1     }
54 cananian 1.1.2.1     // ACCESSOR METHODS:
55 cananian 1.1.2.1     /** Returns the <code>Temp</code> holding the <code>POINTER</code> value
56 cananian 1.1.2.1      *  to dereference. */
57 cananian 1.1.2.1     public Temp ptr() { return ptr; }
58 cananian 1.1.2.1     /** Returns the <code>Temp</code> holding the desired new value for
59 cananian 1.1.2.1      *  the dereference field or element. */
60 cananian 1.1.2.1     public Temp src() { return src; }
61 cananian 1.1.2.3     /** Returns the type of the field or array element we are storing.
62 cananian 1.1.2.3      *  Not necessarily precise if non-primitive.  May be a sub-integer
63 cananian 1.1.2.3      *  type. */
64 cananian 1.1.2.3     public HClass type() { return type; }
65 cananian 1.1.2.1 
66 cananian 1.1.2.1     public int kind() { return LowQuadKind.PSET; }
67 cananian 1.1.2.1 
68 cananian 1.1.2.1     public Temp[] use() { return new Temp[] { ptr, src }; }
69 cananian 1.1.2.1     public Temp[] def() { return new Temp[0]; }
70 cananian 1.1.2.1 
71 cananian 1.1.2.1     public harpoon.IR.Quads.Quad rename(harpoon.IR.Quads.QuadFactory qf,
72 cananian 1.1.2.1                                         TempMap defMap, TempMap useMap) {
73 cananian 1.1.2.1         return new PSET((LowQuadFactory)qf, this,
74 cananian 1.1.2.3                         map(useMap, ptr), map(useMap, src), type);
75 cananian 1.1.2.1     }
76 cananian 1.1.2.1 
77 cananian 1.1.2.2     void accept(LowQuadVisitor v) { v.visit(this); }
78 cananian 1.5         <T> T accept(LowQuadValueVisitor<T> v) { return v.visit(this); }
79 cananian 1.1.2.1 
80 cananian 1.1.2.1     public String toString() {
81 cananian 1.1.2.3         String r = "PSET *" + ptr.toString() + " to " + src.toString();
82 cananian 1.1.2.3         if (type.isPrimitive()) r+=" ("+type.toString()+")";
83 cananian 1.1.2.3         return r;
84 cananian 1.1.2.1     }
85 cananian 1.2     }