1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.rop.code;
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.Constant;
20333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilsonimport com.android.dx.rop.cst.CstString;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Type;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.TypeBearer;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.ToHuman;
24e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodsonimport java.util.concurrent.ConcurrentHashMap;
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Combination of a register number and a type, used as the sources and
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * destinations of register-based operations.
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class RegisterSpec
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        implements TypeBearer, ToHuman, Comparable<RegisterSpec> {
3299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} string to prefix register numbers with */
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static final String PREFIX = "v";
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} intern table for instances */
36e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson    private static final ConcurrentHashMap<Object, RegisterSpec> theInterns =
37e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson        new ConcurrentHashMap<Object, RegisterSpec>(10_000, 0.75f);
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
3999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} common comparison instance used while interning */
40e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson    private static final ThreadLocal<ForComparison> theInterningItem =
41e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson            new ThreadLocal<ForComparison>() {
42e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson                @Override
43e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson                protected ForComparison initialValue() {
44e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson                    return new ForComparison();
45e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson                }
46e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson            };
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code >= 0;} register number */
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final int reg;
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
5199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /** {@code non-null;} type loaded or stored */
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final TypeBearer type;
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
543d0823c03df73acc786940489dcdd5b8e0d7cefeDan Bornstein    /**
553d0823c03df73acc786940489dcdd5b8e0d7cefeDan Bornstein     * {@code null-ok;} local variable info associated with this register,
563d0823c03df73acc786940489dcdd5b8e0d7cefeDan Bornstein     * if any
573d0823c03df73acc786940489dcdd5b8e0d7cefeDan Bornstein     */
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final LocalItem local;
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Intern the given triple as an instance of this class.
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
6399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param reg {@code >= 0;} the register number
6499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param type {@code non-null;} the type (or possibly actual value) which
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is loaded from or stored to the indicated register
6699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param local {@code null-ok;} the associated local variable, if any
6799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} an appropriately-constructed instance
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static RegisterSpec intern(int reg, TypeBearer type,
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            LocalItem local) {
71e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson        ForComparison interningItem = theInterningItem.get();
72e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson        interningItem.set(reg, type, local);
73e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson        RegisterSpec found = theInterns.get(interningItem);
74e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson        if (found == null) {
75e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson            found = interningItem.toRegisterSpec();
76e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson            RegisterSpec existing = theInterns.putIfAbsent(found, found);
77e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson            if (existing != null) {
78e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson                return existing;
79590f78fc4b6e3268149c5eacb7c8b7dd33497f44jeffhao            }
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
81e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson        return found;
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an instance for the given register number and type, with
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * no variable info. This method is allowed to return shared
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instances (but doesn't necessarily do so).
88de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
8999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param reg {@code >= 0;} the register number
9099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param type {@code non-null;} the type (or possibly actual value) which
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is loaded from or stored to the indicated register
9299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} an appropriately-constructed instance
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static RegisterSpec make(int reg, TypeBearer type) {
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return intern(reg, type, null);
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an instance for the given register number, type, and
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * variable info. This method is allowed to return shared
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instances (but doesn't necessarily do so).
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
10399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param reg {@code >= 0;} the register number
10499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param type {@code non-null;} the type (or possibly actual value) which
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is loaded from or stored to the indicated register
10699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param local {@code non-null;} the associated local variable
10799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} an appropriately-constructed instance
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static RegisterSpec make(int reg, TypeBearer type,
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            LocalItem local) {
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (local == null) {
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("local  == null");
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return intern(reg, type, local);
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an instance for the given register number, type, and
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * variable info. This method is allowed to return shared
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instances (but doesn't necessarily do so).
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
12399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param reg {@code >= 0;} the register number
12499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param type {@code non-null;} the type (or possibly actual value) which
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is loaded from or stored to the indicated register
12699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param local {@code null-ok;} the associated variable info or null for
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * none
12899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} an appropriately-constructed instance
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static RegisterSpec makeLocalOptional(
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int reg, TypeBearer type, LocalItem local) {
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return intern(reg, type, local);
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the string form for the given register number.
138de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
13999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param reg {@code >= 0;} the register number
14099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the string form
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static String regString(int reg) {
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return PREFIX + reg;
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Constructs an instance. This constructor is private. Use
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * {@link #make}.
149de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
15099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param reg {@code >= 0;} the register number
15199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param type {@code non-null;} the type (or possibly actual value) which
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * is loaded from or stored to the indicated register
15399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param local {@code null-ok;} the associated local variable, if any
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private RegisterSpec(int reg, TypeBearer type, LocalItem local) {
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (reg < 0) {
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new IllegalArgumentException("reg < 0");
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (type == null) {
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throw new NullPointerException("type == null");
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.reg = reg;
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.type = type;
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.local = local;
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equals(Object other) {
172e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson        if (this == other) {
173e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson            return true;
174e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson        }
175e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!(other instanceof RegisterSpec)) {
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (other instanceof ForComparison) {
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                ForComparison fc = (ForComparison) other;
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return equals(fc.reg, fc.type, fc.local);
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        RegisterSpec spec = (RegisterSpec) other;
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return equals(spec.reg, spec.type, spec.local);
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Like {@code equals}, but only consider the simple types of the
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * registers. That is, this compares {@code getType()} on the types
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * to ignore whatever arbitrary extra stuff might be carried around
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * by an outer {@link TypeBearer}.
193de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
19499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param other {@code null-ok;} spec to compare to
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} iff {@code this} and {@code other} are equal
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * in the stated way
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equalsUsingSimpleType(RegisterSpec other) {
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (!matchesVariable(other)) {
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (reg == other.reg);
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Like {@link #equalsUsingSimpleType} but ignoring the register number.
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * This is useful to determine if two instances refer to the "same"
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * local variable.
210de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
21199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param other {@code null-ok;} spec to compare to
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return {@code true} iff {@code this} and {@code other} are equal
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * in the stated way
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean matchesVariable(RegisterSpec other) {
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (other == null) {
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return false;
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return type.getType().equals(other.type.getType())
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            && ((local == other.local)
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    || ((local != null) && local.equals(other.local)));
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2269289c847255727d063971b6f6ffe68ab870a3ebbOrion Hodson     * Helper for {@link #equals} and
2279289c847255727d063971b6f6ffe68ab870a3ebbOrion Hodson     * {@link com.android.dx.rop.code.RegisterSpec.ForComparison#equals},
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * which actually does the test.
229de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param reg value of the instance variable, for another instance
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param type value of the instance variable, for another instance
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param local value of the instance variable, for another instance
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return whether this instance is equal to one with the given
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * values
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private boolean equals(int reg, TypeBearer type, LocalItem local) {
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (this.reg == reg)
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            && this.type.equals(type)
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            && ((this.local == local)
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    || ((this.local != null) && this.local.equals(local)));
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compares by (in priority order) register number, unwrapped type
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (that is types not {@link TypeBearer}s, and local info.
246de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
24799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param other {@code non-null;} spec to compare to
24899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code -1..1;} standard result of comparison
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
2508f68769869e02895dc6474a5cd0bca20977e5ecdChris Warrington    @Override
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int compareTo(RegisterSpec other) {
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (this.reg < other.reg) {
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return -1;
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (this.reg > other.reg) {
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 1;
256e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson        } else if (this == other) {
257e3b6a03893744fb6b46832e9d72ec1175c2831b1Orion Hodson            return 0;
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int compare = type.getType().compareTo(other.type.getType());
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (compare != 0) {
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return compare;
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (this.local == null) {
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return (other.local == null) ? 0 : -1;
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if (other.local == null) {
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return 1;
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return this.local.compareTo(other.local);
273de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro    }
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int hashCode() {
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return hashCodeOf(reg, type, local);
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
2829289c847255727d063971b6f6ffe68ab870a3ebbOrion Hodson     * Helper for {@link #hashCode} and
2839289c847255727d063971b6f6ffe68ab870a3ebbOrion Hodson     * {@link com.android.dx.rop.code.RegisterSpec.ForComparison#hashCode},
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * which actually does the calculation.
285de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param reg value of the instance variable
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param type value of the instance variable
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param local value of the instance variable
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return the hash code
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static int hashCodeOf(int reg, TypeBearer type, LocalItem local) {
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int hash = (local != null) ? local.hashCode() : 0;
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        hash = (hash * 31 + type.hashCode()) * 31 + reg;
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return hash;
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @Override
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return toString0(false);
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
3058f68769869e02895dc6474a5cd0bca20977e5ecdChris Warrington    @Override
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toHuman() {
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return toString0(true);
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
3118f68769869e02895dc6474a5cd0bca20977e5ecdChris Warrington    @Override
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public Type getType() {
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return type.getType();
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
3178f68769869e02895dc6474a5cd0bca20977e5ecdChris Warrington    @Override
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public TypeBearer getFrameType() {
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return type.getFrameType();
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
3238f68769869e02895dc6474a5cd0bca20977e5ecdChris Warrington    @Override
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final int getBasicType() {
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return type.getBasicType();
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
3298f68769869e02895dc6474a5cd0bca20977e5ecdChris Warrington    @Override
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final int getBasicFrameType() {
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return type.getBasicFrameType();
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /** {@inheritDoc} */
3358f68769869e02895dc6474a5cd0bca20977e5ecdChris Warrington    @Override
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public final boolean isConstant() {
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the register number.
342de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
34399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code >= 0;} the register number
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getReg() {
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return reg;
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the type (or actual value) which is loaded from or stored
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * to the register associated with this instance.
352de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
35399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the type
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public TypeBearer getTypeBearer() {
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return type;
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the variable info associated with this instance, if any.
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
36299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code null-ok;} the variable info, or {@code null} if this
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instance has none
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public LocalItem getLocalItem() {
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return local;
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the next available register number after the one in this
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instance. This is equal to the register number plus the width
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (category) of the type used. Among other things, this may also
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * be used to determine the minimum required register count
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * implied by this instance.
375de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
37699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code >= 0;} the required registers size
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getNextReg() {
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return reg + getCategory();
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the category of this instance's type. This is just a convenient
38499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * shorthand for {@code getType().getCategory()}.
385de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #isCategory1
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #isCategory2
38899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code 1..2;} the category of this instance's type
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getCategory() {
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return type.getType().getCategory();
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets whether this instance's type is category 1. This is just a
39699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * convenient shorthand for {@code getType().isCategory1()}.
397de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #getCategory
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #isCategory2
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return whether or not this instance's type is of category 1
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isCategory1() {
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return type.getType().isCategory1();
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets whether this instance's type is category 2. This is just a
40899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * convenient shorthand for {@code getType().isCategory2()}.
409de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #getCategory
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see #isCategory1
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return whether or not this instance's type is of category 2
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isCategory2() {
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return type.getType().isCategory2();
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Gets the string form for just the register number of this instance.
420de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
42199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the register string form
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String regString() {
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return regString(reg);
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an instance that is the intersection between this instance
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * and the given one, if any. The intersection is defined as follows:
430de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * <ul>
43299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     *   <li>If {@code other} is {@code null}, then the result
43399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     *     is {@code null}.
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *   <li>If the register numbers don't match, then the intersection
43599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     *     is {@code null}. Otherwise, the register number of the
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     intersection is the same as the one in the two instances.</li>
43799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     *   <li>If the types returned by {@code getType()} are not
43899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     *     {@code equals()}, then the intersection is null.</li>
43999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     *   <li>If the type bearers returned by {@code getTypeBearer()}
44099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     *     are {@code equals()}, then the intersection's type bearer
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     is the one from this instance. Otherwise, the intersection's
44299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     *     type bearer is the {@code getType()} of this instance.</li>
44399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     *   <li>If the locals are {@code equals()}, then the local info
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *     of the intersection is the local info of this instance. Otherwise,
44599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     *     the local info of the intersection is {@code null}.</li>
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * </ul>
447de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
44899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param other {@code null-ok;} instance to intersect with (or {@code null})
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param localPrimary whether local variables are primary to the
45099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * intersection; if {@code true}, then the only non-null
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * results occur when registers being intersected have equal local
45299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * infos (or both have {@code null} local infos)
45399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code null-ok;} the intersection
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public RegisterSpec intersect(RegisterSpec other, boolean localPrimary) {
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (this == other) {
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Easy out.
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return this;
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ((other == null) || (reg != other.getReg())) {
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        LocalItem resultLocal =
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ((local == null) || !local.equals(other.getLocalItem()))
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ? null : local;
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        boolean sameName = (resultLocal == local);
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (localPrimary && !sameName) {
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Type thisType = getType();
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Type otherType = other.getType();
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Note: Types are always interned.
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (thisType != otherType) {
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        TypeBearer resultTypeBearer =
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            type.equals(other.getTypeBearer()) ? type : thisType;
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ((resultTypeBearer == type) && sameName) {
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // It turns out that the intersection is "this" after all.
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return this;
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (resultLocal == null) ? make(reg, resultTypeBearer) :
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            make(reg, resultTypeBearer, resultLocal);
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an instance that is identical to this one, except that the
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * register number is replaced by the given one.
497de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
49899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param newReg {@code >= 0;} the new register number
49999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} an appropriately-constructed instance
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public RegisterSpec withReg(int newReg) {
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (reg == newReg) {
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return this;
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return makeLocalOptional(newReg, type, local);
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an instance that is identical to this one, except that
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the type is replaced by the given one.
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
51399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param newType {@code non-null;} the new type
51499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} an appropriately-constructed instance
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public RegisterSpec withType(TypeBearer newType) {
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return makeLocalOptional(reg, newType, local);
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an instance that is identical to this one, except that the
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * register number is offset by the given amount.
523de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param delta the amount to offset the register number by
52599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} an appropriately-constructed instance
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public RegisterSpec withOffset(int delta) {
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (delta == 0) {
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return this;
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return withReg(reg + delta);
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
534de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an instance that is identical to this one, except that
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * the type bearer is replaced by the actual underlying type
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * (thereby stripping off non-type information) with any
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * initialization information stripped away as well.
540de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
54199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} an appropriately-constructed instance
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public RegisterSpec withSimpleType() {
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        TypeBearer orig = type;
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Type newType;
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (orig instanceof Type) {
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            newType = (Type) orig;
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            newType = orig.getType();
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (newType.isUninitialized()) {
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            newType = newType.getInitializedType();
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (newType == orig) {
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return this;
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return makeLocalOptional(reg, newType, local);
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns an instance that is identical to this one except that the
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * local variable is as specified in the parameter.
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
56899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @param local {@code null-ok;} the local item or null for none
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return an appropriate instance
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public RegisterSpec withLocalItem(LocalItem local) {
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ((this.local== local)
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    || ((this.local != null) && this.local.equals(local))) {
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return this;
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return makeLocalOptional(reg, type, local);
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
581d0c62c2a778d1c9148077c869f6313723f57eddcmikaelpeltier    /**
582d0c62c2a778d1c9148077c869f6313723f57eddcmikaelpeltier     * @return boolean specifying if this instance is an even register or not.
583d0c62c2a778d1c9148077c869f6313723f57eddcmikaelpeltier     */
584d0c62c2a778d1c9148077c869f6313723f57eddcmikaelpeltier    public boolean isEvenRegister() {
585d0c62c2a778d1c9148077c869f6313723f57eddcmikaelpeltier      return ((getReg() & 1) == 0);
586d0c62c2a778d1c9148077c869f6313723f57eddcmikaelpeltier    }
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Helper for {@link #toString} and {@link #toHuman}.
590de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro     *
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param human whether to be human-oriented
59299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * @return {@code non-null;} the string form
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private String toString0(boolean human) {
5959dbd802c8c96c3a66873bc600bc7d1374a1d08e5Orion Hodson        StringBuilder sb = new StringBuilder(40);
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append(regString());
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append(":");
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (local != null) {
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append(local.toString());
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Type justType = type.getType();
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sb.append(justType);
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (justType != type) {
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            sb.append("=");
609333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson            if (human && (type instanceof CstString)) {
610333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson                sb.append(((CstString) type).toQuoted());
611333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson            } else if (human && (type instanceof Constant)) {
612333201833d506a3accdeac6ceb7caba8d4b95797Jesse Wilson                sb.append(type.toHuman());
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } else {
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                sb.append(type);
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return sb.toString();
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
6218f68769869e02895dc6474a5cd0bca20977e5ecdChris Warrington    public static void clearInternTable() {
6228f68769869e02895dc6474a5cd0bca20977e5ecdChris Warrington        theInterns.clear();
6238f68769869e02895dc6474a5cd0bca20977e5ecdChris Warrington    }
6248f68769869e02895dc6474a5cd0bca20977e5ecdChris Warrington
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Holder of register spec data for the purposes of comparison (so that
62799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * {@code RegisterSpec} itself can still keep {@code final}
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * instance variables.
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static class ForComparison {
63199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project        /** {@code >= 0;} register number */
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private int reg;
633de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
63499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project        /** {@code non-null;} type loaded or stored */
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private TypeBearer type;
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
63755423dcd081e30c4fc27b997f127db7b00f1b981Dan Bornstein        /**
63855423dcd081e30c4fc27b997f127db7b00f1b981Dan Bornstein         * {@code null-ok;} local variable associated with this
63955423dcd081e30c4fc27b997f127db7b00f1b981Dan Bornstein         * register, if any
64055423dcd081e30c4fc27b997f127db7b00f1b981Dan Bornstein         */
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        private LocalItem local;
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * Set all the instance variables.
645de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro         *
64699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project         * @param reg {@code >= 0;} the register number
64755423dcd081e30c4fc27b997f127db7b00f1b981Dan Bornstein         * @param type {@code non-null;} the type (or possibly actual
64855423dcd081e30c4fc27b997f127db7b00f1b981Dan Bornstein         * value) which is loaded from or stored to the indicated
64955423dcd081e30c4fc27b997f127db7b00f1b981Dan Bornstein         * register
65099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project         * @param local {@code null-ok;} the associated local variable, if any
65199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project         * @return {@code non-null;} an appropriately-constructed instance
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public void set(int reg, TypeBearer type, LocalItem local) {
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.reg = reg;
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.type = type;
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.local = local;
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /**
66099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project         * Construct a {@code RegisterSpec} of this instance's
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         * contents.
662de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro         *
66399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project         * @return {@code non-null;} an appropriately-constructed instance
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project         */
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public RegisterSpec toRegisterSpec() {
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new RegisterSpec(reg, type, local);
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /** {@inheritDoc} */
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public boolean equals(Object other) {
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (!(other instanceof RegisterSpec)) {
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return false;
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            RegisterSpec spec = (RegisterSpec) other;
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return spec.equals(reg, type, local);
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        /** {@inheritDoc} */
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @Override
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public int hashCode() {
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return hashCodeOf(reg, type, local);
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
687