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.CstInteger; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.type.Type; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Implementation of {@link TranslationAdvice} which represents what 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the dex format will be able to represent. 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class DexTranslationAdvice 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project implements TranslationAdvice { 2899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} standard instance of this class */ 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final DexTranslationAdvice THE_ONE = 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project new DexTranslationAdvice(); 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** debug advice for disabling invoke-range optimization */ 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static final DexTranslationAdvice NO_SOURCES_IN_ORDER = 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project new DexTranslationAdvice(true); 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The minimum source width, in register units, for an invoke 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * instruction that requires its sources to be in order and contiguous. 39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static final int MIN_INVOKE_IN_ORDER = 6; 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** when true: always returns false for requiresSourcesInOrder */ 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final boolean disableSourcesInOrder; 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * This class is not publicly instantiable. Use {@link #THE_ONE}. 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private DexTranslationAdvice() { 49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project disableSourcesInOrder = false; 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private DexTranslationAdvice(boolean disableInvokeRange) { 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.disableSourcesInOrder = disableInvokeRange; 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean hasConstantOperation(Rop opcode, 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpec sourceA, RegisterSpec sourceB) { 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (sourceA.getType() != Type.INT) { 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (! (sourceB.getTypeBearer() instanceof CstInteger)) { 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstInteger cst = (CstInteger) sourceB.getTypeBearer(); 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // TODO handle rsub 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (opcode.getOpcode()) { 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // These have 8 and 16 bit cst representations 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.REM: 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.ADD: 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.MUL: 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.DIV: 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.AND: 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.OR: 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.XOR: 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return cst.fitsIn16Bits(); 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // These only have 8 bit cst reps 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.SHL: 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.SHR: 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RegOps.USHR: 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return cst.fitsIn8Bits(); 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default: 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return false; 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public boolean requiresSourcesInOrder(Rop opcode, 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project RegisterSpecList sources) { 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return !disableSourcesInOrder && opcode.isCallLike() 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project && totalRopWidth(sources) >= MIN_INVOKE_IN_ORDER; 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Calculates the total rop width of the list of SSA registers 100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param sources {@code non-null;} list of SSA registers 10299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @return {@code >= 0;} rop-form width in register units 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private int totalRopWidth(RegisterSpecList sources) { 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int sz = sources.size(); 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int total = 0; 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (int i = 0; i < sz; i++) { 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project total += sources.get(i).getCategory(); 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return total; 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int getMaxOptimalRegisterCount() { 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 16; 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 120