1fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross/* 2fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * Copyright (C) 2009 The Android Open Source Project 3fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * 4fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * Licensed under the Apache License, Version 2.0 (the "License"); 5fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * you may not use this file except in compliance with the License. 6fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * You may obtain a copy of the License at 7fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * 8fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * http://www.apache.org/licenses/LICENSE-2.0 9fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * 10fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * Unless required by applicable law or agreed to in writing, software 11fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * distributed under the License is distributed on an "AS IS" BASIS, 12fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * See the License for the specific language governing permissions and 14fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * limitations under the License. 15fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross */ 16fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross 17fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross/* 18fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * Determine the initial instruction set to be used for this trace. 19fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * Later components may decide to change this. 20fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross */ 21fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin CrossJitInstructionSetType dvmCompilerInstructionSet(void) 22fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross{ 23fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross return DALVIK_JIT_THUMB2; 24fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross} 25fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross 26fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross/* Architecture-specific initializations and checks go here */ 27fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Crossbool dvmCompilerArchVariantInit(void) 28fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross{ 29fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross /* First, declare dvmCompiler_TEMPLATE_XXX for each template */ 30fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross#define JIT_TEMPLATE(X) extern void dvmCompiler_TEMPLATE_##X(); 31fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross#include "../../../template/armv5te-vfp/TemplateOpList.h" 32fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross#undef JIT_TEMPLATE 33fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross 34fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross int i = 0; 35fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross extern void dvmCompilerTemplateStart(void); 36fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross 37fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross /* 38fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * Then, populate the templateEntryOffsets array with the offsets from the 39fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross * the dvmCompilerTemplateStart symbol for each template. 40fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross */ 41fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross#define JIT_TEMPLATE(X) templateEntryOffsets[i++] = \ 42fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross (intptr_t) dvmCompiler_TEMPLATE_##X - (intptr_t) dvmCompilerTemplateStart; 43fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross#include "../../../template/armv5te-vfp/TemplateOpList.h" 44fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross#undef JIT_TEMPLATE 45fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross 46fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross /* Target-specific configuration */ 47fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross gDvmJit.jitTableSize = 1 << 12; // 4096 48fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross gDvmJit.jitTableMask = gDvmJit.jitTableSize - 1; 49fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross gDvmJit.threshold = 40; 50fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross gDvmJit.codeCacheSize = 1024*1024; 51fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross 52fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross#if defined(WITH_SELF_VERIFICATION) 53fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross /* Force into blocking */ 54fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross gDvmJit.blockingMode = true; 5511d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng gDvm.nativeDebuggerActive = true; 56fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross#endif 57fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross 58fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross /* Codegen-specific assumptions */ 59fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross assert(offsetof(ClassObject, vtable) < 128 && 60fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross (offsetof(ClassObject, vtable) & 0x3) == 0); 61fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross assert(offsetof(ArrayObject, length) < 128 && 62fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross (offsetof(ArrayObject, length) & 0x3) == 0); 63fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross assert(offsetof(ArrayObject, contents) < 256); 64fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross 65fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross /* Up to 5 args are pushed on top of FP - sizeofStackSaveArea */ 66fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross assert(sizeof(StackSaveArea) < 236); 67fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross 68fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross /* 6911d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng * EA is calculated by doing "Rn + imm5 << 2", make sure that the last 7011d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng * offset from the struct is less than 128. 71fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross */ 7211d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng assert((offsetof(InterpState, jitToInterpEntries) + 7311d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng sizeof(struct JitToInterpEntries)) <= 128); 74fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross return true; 75fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross} 76fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross 77fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Crossint dvmCompilerTargetOptHint(int key) 78fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross{ 79fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross int res; 80fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross switch (key) { 81fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross case kMaxHoistDistance: 82fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross res = 7; 83fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross break; 84fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross default: 85fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross LOGE("Unknown target optimization hint key: %d",key); 86fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross res = 0; 87fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross } 88fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross return res; 89fd7e221cce6d3c63fd26599d58e0a35db7f5d1faColin Cross} 90