1 cananian 1.1.2.1 // MOVE.java, created Wed Aug  5 06:53:38 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.6 import harpoon.ClassFile.HCodeElement;
 7 cananian 1.1.2.1 import harpoon.Temp.Temp;
 8 cananian 1.1.2.1 import harpoon.Temp.TempMap;
 9 cananian 1.1.2.2 import harpoon.Util.Util;
10 cananian 1.1.2.1 
11 cananian 1.1.2.1 /**
12 cananian 1.1.2.1  * <code>MOVE</code> objects represent an assignment to a compiler temporary.
13 cananian 1.1.2.1  * The source of the assignment must be another temporary.
14 cananian 1.1.2.1  * 
15 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
16 cananian 1.5      * @version $Id: MOVE.java,v 1.5 2002/04/11 04:00:34 cananian Exp $
17 cananian 1.1.2.1  */
18 cananian 1.1.2.1 public class MOVE extends Quad {
19 cananian 1.1.2.2     /** The destination <code>Temp</code>. */
20 cananian 1.1.2.2     protected Temp dst;
21 cananian 1.1.2.2     /** The source <code>Temp</code>. */
22 cananian 1.1.2.2     protected Temp src;
23 cananian 1.1.2.1     
24 cananian 1.1.2.2     /** Creates a <code>MOVE</code> from a source and destination 
25 cananian 1.1.2.2      *  <code>Temp</code>.
26 cananian 1.1.2.2      * @param dst the destination <code>Temp</code>.
27 cananian 1.1.2.2      * @param src the source <code>Temp</code>.
28 cananian 1.1.2.2      */
29 cananian 1.1.2.4     public MOVE(QuadFactory qf, HCodeElement source,
30 cananian 1.1.2.1                Temp dst, Temp src) {
31 cananian 1.1.2.4         super(qf, source);
32 cananian 1.1.2.1         this.dst = dst; this.src = src;
33 cananian 1.3.2.1         assert dst!=null && src!=null;
34 cananian 1.1.2.1     }
35 cananian 1.1.2.2     // ACCESSOR METHODS:
36 cananian 1.1.2.2     /** Returns the destination <code>Temp</code>. */
37 cananian 1.1.2.2     public Temp dst() { return dst; }
38 cananian 1.1.2.2     /** Returns the source <code>Temp</code>. */
39 cananian 1.1.2.2     public Temp src() { return src; }
40 cananian 1.1.2.1     
41 cananian 1.1.2.2     /** Returns the <code>Temp</code>s used by this <code>Quad</code>. */
42 cananian 1.1.2.1     public Temp[] use() { return new Temp[] { src }; }
43 cananian 1.1.2.2     /** Returns the <code>Temp</code>s defined by this <code>Quad</code>. */
44 cananian 1.1.2.1     public Temp[] def() { return new Temp[] { dst }; }
45 cananian 1.1.2.1 
46 cananian 1.1.2.3     public int kind() { return QuadKind.MOVE; }
47 cananian 1.1.2.3 
48 cananian 1.1.2.5     public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) {
49 cananian 1.1.2.5         return new MOVE(qqf, this, map(defMap, dst), map(useMap, src));
50 cananian 1.1.2.3     }
51 cananian 1.1.2.2     /** Rename all defined variables in this <code>Quad</code> according 
52 cananian 1.1.2.5      *  to a mapping.
53 cananian 1.1.2.5      * @deprecated does not preserve immutability. */
54 cananian 1.1.2.3     void renameDefs(TempMap tm) {
55 cananian 1.1.2.1         dst = tm.tempMap(dst);
56 cananian 1.1.2.1     }
57 cananian 1.1.2.2     /** Rename all used variables in this <code>Quad</code> according 
58 cananian 1.1.2.5      *  to a mapping.
59 cananian 1.1.2.5      * @deprecated does not preserve immutability. */
60 cananian 1.1.2.3     void renameUses(TempMap tm) {
61 cananian 1.1.2.1         src = tm.tempMap(src);
62 cananian 1.1.2.1     }
63 cananian 1.1.2.1 
64 cananian 1.1.2.7     public void accept(QuadVisitor v) { v.visit(this); }
65 cananian 1.5         public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); }
66 cananian 1.1.2.1 
67 cananian 1.1.2.2     /** Returns a human-readable representation of this <code>Quad</code>. */
68 cananian 1.1.2.1     public String toString() { 
69 cananian 1.1.2.1         return dst.toString() + " = MOVE " + src.toString();
70 cananian 1.1.2.1     }
71 cananian 1.2     }