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