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 } 587b133ef7c84e68c3c4042176d830ea5b52e84139Ben Cheng gDvmJit.codeCacheSize = 512*1024; 599797a237b48e880c33e2a2f497f48fb6f67c7a16Bill Buzbee 609797a237b48e880c33e2a2f497f48fb6f67c7a16Bill Buzbee#if defined(WITH_SELF_VERIFICATION) 61e438a6a23bc0b44bf909e6838c6bb9649fe2e474Bill Buzbee /* Force into blocking mode */ 629797a237b48e880c33e2a2f497f48fb6f67c7a16Bill Buzbee gDvmJit.blockingMode = true; 6311d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng gDvm.nativeDebuggerActive = true; 649797a237b48e880c33e2a2f497f48fb6f67c7a16Bill Buzbee#endif 659797a237b48e880c33e2a2f497f48fb6f67c7a16Bill Buzbee 6650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee /* Codegen-specific assumptions */ 67dc2a1881fe75a8dd961fb24509621c7c97694c9aCarl Shapiro assert(OFFSETOF_MEMBER(ClassObject, vtable) < 128 && 68dc2a1881fe75a8dd961fb24509621c7c97694c9aCarl Shapiro (OFFSETOF_MEMBER(ClassObject, vtable) & 0x3) == 0); 69a62c3a0ab3fcdde37f47d16e9699a935ae7a8e88Carl Shapiro assert(OFFSETOF_MEMBER(ArrayObject, length) < 128 && 70a62c3a0ab3fcdde37f47d16e9699a935ae7a8e88Carl Shapiro (OFFSETOF_MEMBER(ArrayObject, length) & 0x3) == 0); 71a62c3a0ab3fcdde37f47d16e9699a935ae7a8e88Carl Shapiro assert(OFFSETOF_MEMBER(ArrayObject, contents) < 256); 7250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee 7350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee /* Up to 5 args are pushed on top of FP - sizeofStackSaveArea */ 7450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee assert(sizeof(StackSaveArea) < 236); 7550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee 7650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee /* 774fa9da7e20ada53eac75216e038a2887d85df19eBen Cheng * EA is calculated by doing "Rn + imm5 << 2". Make sure that the last 7811d8f14eef83d1b7bfa8f116de56a92d5ba9e71eBen Cheng * offset from the struct is less than 128. 7950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee */ 809f601a917c8878204482c37aec7005054b6776fabuzbee if ((offsetof(Thread, jitToInterpEntries) + 814fa9da7e20ada53eac75216e038a2887d85df19eBen Cheng sizeof(struct JitToInterpEntries)) >= 128) { 82c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block ALOGE("Thread.jitToInterpEntries size overflow"); 834fa9da7e20ada53eac75216e038a2887d85df19eBen Cheng dvmAbort(); 844fa9da7e20ada53eac75216e038a2887d85df19eBen Cheng } 85cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng 86cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng /* No method JIT for Thumb backend */ 87cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng gDvmJit.disableOpt |= (1 << kMethodJit); 88cfdeca37fcaa27c37bad5077223e4d1e87f1182eBen Cheng 899a3147c7412f4794434b4c2604aa2ba784867774buzbee // Make sure all threads have current values 9099e3e6e72e3471eb85fc2e405866392b01c080febuzbee dvmJitUpdateThreadStateAll(); 919a3147c7412f4794434b4c2604aa2ba784867774buzbee 9250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee return true; 9350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee} 941f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee 951f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbeeint dvmCompilerTargetOptHint(int key) 961f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee{ 971f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee int res; 981f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee switch (key) { 991f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee case kMaxHoistDistance: 1001f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee res = 2; 1011f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee break; 1021f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee default: 103c1a4ab9c313d8a3d12007f2dbef7b5a6fa4ac2efSteve Block ALOGE("Unknown target optimization hint key: %d",key); 1041f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee res = 0; 1051f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee } 1061f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee return res; 1071f74863d3e0f19930818398f375ebf1cf2d78969Bill Buzbee} 108ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee 1092ce33c938286c7694238b417be65a9918f421b3dbuzbeevoid dvmCompilerGenMemBarrier(CompilationUnit *cUnit, int barrierKind) 110ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee{ 111ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee#if ANDROID_SMP != 0 112ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee#error armv5+smp not supported 113ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee#endif 114ecf8f6ede2c00350a36297dd7427afff9d9cb154buzbee} 115