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