150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* 250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * Copyright (C) 2009 The Android Open Source Project 350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * 450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * Licensed under the Apache License, Version 2.0 (the "License"); 550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * you may not use this file except in compliance with the License. 650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * You may obtain a copy of the License at 750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * 850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * http://www.apache.org/licenses/LICENSE-2.0 950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * 1050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * Unless required by applicable law or agreed to in writing, software 1150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * distributed under the License is distributed on an "AS IS" BASIS, 1250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * See the License for the specific language governing permissions and 1450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * limitations under the License. 1550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee */ 1650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee 17bbf31b58c50fb892423b7fef0d8c1093bd0c1a6cBrian Carlstromextern "C" void dvmCompilerTemplateStart(void); 18bbf31b58c50fb892423b7fef0d8c1093bd0c1a6cBrian Carlstrom 1950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* 2050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * This file is included by Codegen-armv5te.c, and implements architecture 2150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * variant-specific code. 2250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee */ 2350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee 2450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* 25716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee * Determine the initial instruction set to be used for this trace. 26716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee * Later components may decide to change this. 27716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee */ 285d90c20bd7903d7bba966b224e576bf137bf8b4bBen ChengJitInstructionSetType dvmCompilerInstructionSet(void) 29716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee{ 30716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee return DALVIK_JIT_THUMB; 31716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee} 32716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee 33bbf31b58c50fb892423b7fef0d8c1093bd0c1a6cBrian Carlstrom/* First, declare dvmCompiler_TEMPLATE_XXX for each template */ 34bbf31b58c50fb892423b7fef0d8c1093bd0c1a6cBrian Carlstrom#define JIT_TEMPLATE(X) extern "C" void dvmCompiler_TEMPLATE_##X(); 3550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#include "../../../template/armv5te/TemplateOpList.h" 3650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#undef JIT_TEMPLATE 3750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee 38bbf31b58c50fb892423b7fef0d8c1093bd0c1a6cBrian Carlstrom/* Architecture-specific initializations and checks go here */ 39bbf31b58c50fb892423b7fef0d8c1093bd0c1a6cBrian Carlstrombool dvmCompilerArchVariantInit(void) 40bbf31b58c50fb892423b7fef0d8c1093bd0c1a6cBrian Carlstrom{ 4150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee int i = 0; 4250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee 4350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee /* 4450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * Then, populate the templateEntryOffsets array with the offsets from the 4550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * the dvmCompilerTemplateStart symbol for each template. 4650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee */ 4750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#define JIT_TEMPLATE(X) templateEntryOffsets[i++] = \ 4850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee (intptr_t) dvmCompiler_TEMPLATE_##X - (intptr_t) dvmCompilerTemplateStart; 4950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#include "../../../template/armv5te/TemplateOpList.h" 5050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#undef JIT_TEMPLATE 5150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee 529797a237b48e880c33e2a2f497f48fb6f67c7a16Bill Buzbee /* Target-specific configuration */ 539797a237b48e880c33e2a2f497f48fb6f67c7a16Bill Buzbee gDvmJit.jitTableSize = 1 << 9; // 512 549797a237b48e880c33e2a2f497f48fb6f67c7a16Bill Buzbee gDvmJit.jitTableMask = gDvmJit.jitTableSize - 1; 55095469786603fe53b26ab78091ab33535f94b423Elliott Hughes if (gDvmJit.threshold == 0) { 56c89d83e1c05979b68037ad15413fa4460a88e36fElliott Hughes gDvmJit.threshold = 200; 57c89d83e1c05979b68037ad15413fa4460a88e36fElliott Hughes } 58bbbe552a31f7229708bfc748480ce538218ae076buzbee if (gDvmJit.codeCacheSize == DEFAULT_CODE_CACHE_SIZE) { 59bbbe552a31f7229708bfc748480ce538218ae076buzbee gDvmJit.codeCacheSize = 512 * 1024; 60bbbe552a31f7229708bfc748480ce538218ae076buzbee } else if ((gDvmJit.codeCacheSize == 0) && (gDvm.executionMode == kExecutionModeJit)) { 61bbbe552a31f7229708bfc748480ce538218ae076buzbee gDvm.executionMode = kExecutionModeInterpFast; 62bbbe552a31f7229708bfc748480ce538218ae076buzbee } 63bbbe552a31f7229708bfc748480ce538218ae076buzbee /* Hard limit for Arm of 2M */ 64bbbe552a31f7229708bfc748480ce538218ae076buzbee assert(gDvmJit.codeCacheSize <= 2 * 1024 * 1024); 659797a237b48e880c33e2a2f497f48fb6f67c7a16Bill Buzbee 669797a237b48e880c33e2a2f497f48fb6f67c7a16Bill Buzbee#if defined(WITH_SELF_VERIFICATION) 67e438a6a23bc0b44bf909e6838c6bb9649fe2e474Bill Buzbee /* Force into blocking mode */ 689797a237b48e880c33e2a2f497f48fb6f67c7a16Bill Buzbee gDvmJit.blockingMode = true; 6911d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng gDvm.nativeDebuggerActive = true; 709797a237b48e880c33e2a2f497f48fb6f67c7a16Bill Buzbee#endif 719797a237b48e880c33e2a2f497f48fb6f67c7a16Bill Buzbee 7250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee /* Codegen-specific assumptions */ 73dc2a1881fe75a8dd961fb24509621c7c97694c9aCarl Shapiro assert(OFFSETOF_MEMBER(ClassObject, vtable) < 128 && 74dc2a1881fe75a8dd961fb24509621c7c97694c9aCarl Shapiro (OFFSETOF_MEMBER(ClassObject, vtable) & 0x3) == 0); 75a62c3a0ab3fcdde37f47d16e9699a935ae7a8e88Carl Shapiro assert(OFFSETOF_MEMBER(ArrayObject, length) < 128 && 76a62c3a0ab3fcdde37f47d16e9699a935ae7a8e88Carl Shapiro (OFFSETOF_MEMBER(ArrayObject, length) & 0x3) == 0); 77a62c3a0ab3fcdde37f47d16e9699a935ae7a8e88Carl Shapiro assert(OFFSETOF_MEMBER(ArrayObject, contents) < 256); 7850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee 7950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee /* Up to 5 args are pushed on top of FP - sizeofStackSaveArea */ 8050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee assert(sizeof(StackSaveArea) < 236); 8150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee 8250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee /* 834fa9da7e20ada53eac75216e038a2887d85df19eBen Cheng * EA is calculated by doing "Rn + imm5 << 2". Make sure that the last 8411d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng * offset from the struct is less than 128. 8550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee */ 869f601a917c8878204482c37aec7005054b6776fabuzbee if ((offsetof(Thread, jitToInterpEntries) + 874fa9da7e20ada53eac75216e038a2887d85df19eBen Cheng sizeof(struct JitToInterpEntries)) >= 128) { 88c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block ALOGE("Thread.jitToInterpEntries size overflow"); 894fa9da7e20ada53eac75216e038a2887d85df19eBen Cheng dvmAbort(); 904fa9da7e20ada53eac75216e038a2887d85df19eBen Cheng } 91cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng 92cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng /* No method JIT for Thumb backend */ 93cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng gDvmJit.disableOpt |= (1 << kMethodJit); 94cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng 959a3147c7412f4794434b4c2604aa2ba784867774buzbee // Make sure all threads have current values 9699e3e6e72e3471eb85fc2e405866392b01c080febuzbee dvmJitUpdateThreadStateAll(); 979a3147c7412f4794434b4c2604aa2ba784867774buzbee 9850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee return true; 9950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee} 1001f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee 1011f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbeeint dvmCompilerTargetOptHint(int key) 1021f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee{ 1031f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee int res; 1041f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee switch (key) { 1051f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee case kMaxHoistDistance: 1061f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee res = 2; 1071f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee break; 1081f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee default: 109c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block ALOGE("Unknown target optimization hint key: %d",key); 1101f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee res = 0; 1111f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee } 1121f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee return res; 1131f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee} 114ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee 1152ce33c938286c7694238b417be65a9918f421b3dbuzbeevoid dvmCompilerGenMemBarrier(CompilationUnit *cUnit, int barrierKind) 116ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee{ 117ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee#if ANDROID_SMP != 0 118ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee#error armv5+smp not supported 119ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee#endif 120ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee} 121