1579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/* 2579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Copyright (C) 2007 The Android Open Source Project 3579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 4579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Licensed under the Apache License, Version 2.0 (the "License"); 5579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * you may not use this file except in compliance with the License. 6579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * You may obtain a copy of the License at 7579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 8579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 10579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Unless required by applicable law or agreed to in writing, software 11579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS, 12579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * See the License for the specific language governing permissions and 14579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * limitations under the License. 15579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 16579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 17579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpackage com.android.dx.ssa; 18579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 19579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.RegisterSpec; 20579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.rop.code.RegisterSpecList; 21579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonimport com.android.dx.util.ToHuman; 22579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 23579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson/** 24579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Represents a mapping between two register numbering schemes. 25579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Subclasses of this may be mutable, and as such the mapping provided 26579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * is only valid for the lifetime of the method call in which 27579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * instances of this class are passed. 28579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 29579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilsonpublic abstract class RegisterMapper { 30579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 31579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * Gets the count of registers (really, the total register width, since 32579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * category width is counted) in the new namespace. 33579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return >= 0 width of new namespace. 34579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 35579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public abstract int getNewRegisterCount(); 36579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 37579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 38579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param registerSpec old register 39579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return register in new space 40579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 41579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public abstract RegisterSpec map(RegisterSpec registerSpec); 42579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 43579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson /** 44579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * 45579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @param sources old register list 46579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson * @return new mapped register list, or old if nothing has changed. 47579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson */ 48579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson public final RegisterSpecList map(RegisterSpecList sources) { 49579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson int sz = sources.size(); 50579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson RegisterSpecList newSources = new RegisterSpecList(sz); 51579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 52579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson for (int i = 0; i < sz; i++) { 53579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson newSources.set(i, map(sources.get(i))); 54579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 55579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 56579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson newSources.setImmutable(); 57579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson 58579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson // Return the old sources if nothing has changed. 59579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson return newSources.equals(sources) ? sources : newSources; 60579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson } 61579d7739c53a2707ad711a2d2cae46d7d782f06Jesse Wilson} 62