diff options
Diffstat (limited to 'vm/compiler/codegen/PostOptimizer.h')
| -rw-r--r-- | vm/compiler/codegen/PostOptimizer.h | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/vm/compiler/codegen/PostOptimizer.h b/vm/compiler/codegen/PostOptimizer.h new file mode 100644 index 000000000..006102ac3 --- /dev/null +++ b/vm/compiler/codegen/PostOptimizer.h @@ -0,0 +1,267 @@ +/* Copyright (c) 2012, The Linux Foundation. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials provided + * with the distribution. + * * Neither the name of The Linux Foundation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef DALVIK_VM_COMPILER_POSTOPTIMIZATION_H_ +#define DALVIK_VM_COMPILER_POSTOPTIMIZATION_H_ + +#include "Dalvik.h" +#include "libdex/DexOpcodes.h" +#include "compiler/codegen/arm/ArmLIR.h" + +//#include "compiler/codegen/Ralloc.h" + +//#include "compiler/codegen/arm/ArmLIR.h" +/* +#include "InlineNative.h" +#include "vm/Globals.h" +#include "vm/compiler/Loop.h" +#include "vm/compiler/Compiler.h" +#include "vm/compiler/CompilerInternals.h" +#include "vm/compiler/codegen/arm/ArmLIR.h" +#include "libdex/OpCodeNames.h" +#include "vm/compiler/codegen/arm/CalloutHelper.h" +#include "vm/compiler/codegen/arm/Ralloc.h" +*/ + + +/* Forward declarations */ +struct CompilationUnit; +struct LIR; +struct MIR; +//struct RegLocation; +struct ArmLIR; + +/* +enum OpCode; +enum RegisterClass; +////enum ArmOpCode; +enum ArmOpcode; +enum ArmConditionCode; +enum TemplateOpCode; +*/ + +void dvmCompilerApplyLocalOptimizations(struct CompilationUnit *cUnit, + struct LIR *head, + struct LIR *tail); + +void dvmCompilerApplyGlobalOptimizations(struct CompilationUnit *cUnit); + +bool dvmArithLocalOptimization(struct CompilationUnit *cUnit, + struct MIR *mir, + struct RegLocation rlDest, + struct RegLocation rlSrc1, + struct RegLocation rlSrc2); + +typedef struct LocalOptsFuncMap{ + + bool (*handleEasyDivide) (struct CompilationUnit *cUnit, + enum Opcode dalvikOpCode, + struct RegLocation rlSrc, + struct RegLocation rlDest, + int lit); + bool (*handleEasyMultiply) (struct CompilationUnit *cUnit, + struct RegLocation rlSrc, + struct RegLocation rlDest, + int lit); + bool (*handleExecuteInline) (struct CompilationUnit *cUnit, + struct MIR *mir); + void (*handleExtendedMIR) (struct CompilationUnit *cUnit, + struct MIR *mir); + void (*insertChainingSwitch) (struct CompilationUnit *cUnit); + bool (*isPopCountLE2) (unsigned int x); + bool (*isPowerOfTwo) (int x); + int (*lowestSetBit) (unsigned int x); + void (*markCard) (struct CompilationUnit *cUnit, + int valReg, + int tgtAddrReg); + void (*setupLoopEntryBlock) (struct CompilationUnit *cUnit, + struct BasicBlock *entry, + struct ArmLIR *bodyLabel); + void (*genInterpSingleStep) (struct CompilationUnit *cUnit, + struct MIR *mir); + void (*setMemRefType) (struct ArmLIR *lir, + bool isLoad, + int memType); + void (*annotateDalvikRegAccess) (struct ArmLIR *lir, + int regId, + bool isLoad); + void (*setupResourceMasks) (struct ArmLIR *lir); + struct ArmLIR *(*newLIR0) (struct CompilationUnit *cUnit, + enum ArmOpcode opCode); + struct ArmLIR *(*newLIR1) (struct CompilationUnit *cUnit, + enum ArmOpcode opCode, + int dest); + struct ArmLIR *(*newLIR2) (struct CompilationUnit *cUnit, + enum ArmOpcode opCode, + int dest, + int src1); + struct ArmLIR *(*newLIR3) (struct CompilationUnit *cUnit, + enum ArmOpcode opCode, + int dest, + int src1, + int src2); +#if defined(_ARMV7_A) || defined(_ARMV7_A_NEON) + struct ArmLIR *(*newLIR4) (struct CompilationUnit *cUnit, + enum ArmOpcode opCode, + int dest, + int src1, + int src2, + int info); +#endif + struct RegLocation (*inlinedTarget) (struct CompilationUnit *cUnit, + struct MIR *mir, + bool fpHint); + struct ArmLIR *(*genCheckCommon) (struct CompilationUnit *cUnit, + int dOffset, + struct ArmLIR *branch, + struct ArmLIR *pcrLabel); + struct ArmLIR *(*loadWordDisp) (struct CompilationUnit *cUnit, + int rBase, + int displacement, + int rDest); + struct ArmLIR *(*storeWordDisp) (struct CompilationUnit *cUnit, + int rBase, + int displacement, + int rSrc); + void (*loadValueDirect) (struct CompilationUnit *cUnit, + struct RegLocation rlSrc, + int reg1); + void (*loadValueDirectFixed) (struct CompilationUnit *cUnit, + struct RegLocation rlSrc, + int reg1); + void (*loadValueDirectWide) (struct CompilationUnit *cUnit, + struct RegLocation rlSrc, + int regLo, + int regHi); + void (*loadValueDirectWideFixed) (struct CompilationUnit *cUnit, + struct RegLocation rlSrc, + int regLo, + int regHi); + struct RegLocation (*loadValue) (struct CompilationUnit *cUnit, + struct RegLocation rlSrc, + enum RegisterClass opKind); + void (*storeValue) (struct CompilationUnit *cUnit, + struct RegLocation rlDest, + struct RegLocation rlSrc); + struct RegLocation (*loadValueWide) (struct CompilationUnit *cUnit, + struct RegLocation rlSrc, + enum RegisterClass opKind); + struct ArmLIR *(*genNullCheck) (struct CompilationUnit *cUnit, + int sReg, + int mReg, + int dOffset, + struct ArmLIR *pcrLabel); + struct ArmLIR *(*genRegRegCheck) (struct CompilationUnit *cUnit, + enum ArmConditionCode cond, + int reg1, + int reg2, + int dOffset, + struct ArmLIR *pcrLabel); + struct ArmLIR *(*genZeroCheck) (struct CompilationUnit *cUnit, + int mReg, + int dOffset, + struct ArmLIR *pcrLabel); + struct ArmLIR *(*genBoundsCheck) (struct CompilationUnit *cUnit, + int rIndex, + int rBound, + int dOffset, + struct ArmLIR *pcrLabel); + struct ArmLIR *(*loadConstantNoClobber) (struct CompilationUnit *cUnit, + int rDest, + int value); + struct ArmLIR *(*loadConstant) (struct CompilationUnit *cUnit, + int rDest, + int value); + void (*storeValueWide) (struct CompilationUnit *cUnit, + struct RegLocation rlDest, + struct RegLocation rlSrc); + void (*genSuspendPoll) (struct CompilationUnit *cUnit, struct MIR *mir); + struct ArmLIR *(*storeBaseDispWide)(struct CompilationUnit *cUnit, + int rBase, + int displacement, + int rSrcLo, + int rSrcHi); + struct ArmLIR *(*storeBaseDisp)(struct CompilationUnit *cUnit, + int rBase, + int displacement, + int rSrc, + OpSize size); + struct ArmLIR *(*loadBaseDispWide)(struct CompilationUnit *cUnit, + MIR *mir, + int rBase, + int displacement, + int rDestLo, + int rDestHi, + int sReg); + struct ArmLIR *(*opRegRegImm)(struct CompilationUnit *cUnit, + enum OpKind op, + int rDest, + int rSrc1, + int value); + struct ArmLIR *(*opRegRegReg)(struct CompilationUnit *cUnit, + enum OpKind op, + int rDest, + int rSrc1, + int rSrc2); + struct ArmLIR *(*loadBaseIndexed)(struct CompilationUnit *cUnit, + int rBase, + int rIndex, + int rDest, + int scale, + enum OpSize size); + struct ArmLIR *(*storeBaseIndexed)(struct CompilationUnit *cUnit, + int rBase, + int rIndex, + int rSrc, + int scale, + enum OpSize size); + enum RegisterClass (*dvmCompilerRegClassBySize)(enum OpSize size); + int (*encodeShift)(int code, int amount); + struct ArmLIR *(*opRegReg)(struct CompilationUnit *cUnit, + enum OpKind op, + int rDestSrc1, + int rSrc2); + struct ArmLIR *(*opCondBranch)(struct CompilationUnit *cUnit, + enum ArmConditionCode cc); + struct ArmLIR *(*genIT)(struct CompilationUnit *cUnit, + enum ArmConditionCode code, + const char *guide); + void (*genBarrier)(struct CompilationUnit *cUnit); + int (*modifiedImmediate)(u4 value); + struct ArmLIR *(*genRegImmCheck)(struct CompilationUnit *cUnit, + enum ArmConditionCode cond, + int reg, + int checkValue, + int dOffset, + ArmLIR *pcrLabel); +} LocalOptsFuncMap; + +extern LocalOptsFuncMap localOptsFunMap; + +#endif // DALVIK_VM_COMPILER_POSTOPTIMIZATION_H_ + |
