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