ArchVariant.cpp revision 5d90c20bd7903d7bba966b224e576bf137bf8b4b
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
1750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/*
1850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * This file is included by Codegen-armv5te.c, and implements architecture
1950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee * variant-specific code.
2050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee */
2150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
2250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/*
23716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee * Determine the initial instruction set to be used for this trace.
24716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee * Later components may decide to change this.
25716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee */
265d90c20bd7903d7bba966b224e576bf137bf8b4bBen ChengJitInstructionSetType dvmCompilerInstructionSet(void)
27716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee{
28716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee    return DALVIK_JIT_THUMB;
29716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee}
30716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee
3150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee/* Architecture-specific initializations and checks go here */
325d90c20bd7903d7bba966b224e576bf137bf8b4bBen Chengbool dvmCompilerArchVariantInit(void)
3350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee{
3450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* First, declare dvmCompiler_TEMPLATE_XXX for each template */
3550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#define JIT_TEMPLATE(X) extern void dvmCompiler_TEMPLATE_##X();
3650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#include "../../../template/armv5te/TemplateOpList.h"
3750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#undef JIT_TEMPLATE
3850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
3950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    int i = 0;
4050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    extern void dvmCompilerTemplateStart(void);
4150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
4250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
4350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * Then, populate the templateEntryOffsets array with the offsets from the
4450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * the dvmCompilerTemplateStart symbol for each template.
4550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
4650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#define JIT_TEMPLATE(X) templateEntryOffsets[i++] = \
4750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    (intptr_t) dvmCompiler_TEMPLATE_##X - (intptr_t) dvmCompilerTemplateStart;
4850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#include "../../../template/armv5te/TemplateOpList.h"
4950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee#undef JIT_TEMPLATE
5050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
5150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* Codegen-specific assumptions */
5250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    assert(offsetof(ClassObject, vtable) < 128 &&
5350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee           (offsetof(ClassObject, vtable) & 0x3) == 0);
5450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    assert(offsetof(ArrayObject, length) < 128 &&
5550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee           (offsetof(ArrayObject, length) & 0x3) == 0);
5650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    assert(offsetof(ArrayObject, contents) < 256);
5750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
5850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /* Up to 5 args are pushed on top of FP - sizeofStackSaveArea */
5950a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    assert(sizeof(StackSaveArea) < 236);
6050a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee
6150a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    /*
6250a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * EA is calculated by doing "Rn + imm5 << 2", and there are 5 entry points
6350a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * that codegen may access, make sure that the offset from the top of the
6450a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     * struct is less than 108.
6550a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee     */
6650a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    assert(offsetof(InterpState, jitToInterpEntries) < 108);
6750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee    return true;
6850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbee}
69