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