Jit.h revision 716f120d7f33ca18a5dcbef811399df0cbefe5d0
1ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 2ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Copyright (C) 2009 The Android Open Source Project 3ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 4ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 5ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * you may not use this file except in compliance with the License. 6ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * You may obtain a copy of the License at 7ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 8ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * http://www.apache.org/licenses/LICENSE-2.0 9ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * 10ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Unless required by applicable law or agreed to in writing, software 11ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * distributed under the License is distributed on an "AS IS" BASIS, 12ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * See the License for the specific language governing permissions and 14ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * limitations under the License. 15ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 16ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 17ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Jit control 18ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 19ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#ifndef _DALVIK_INTERP_JIT 20ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#define _DALVIK_INTERP_JIT 21ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 22ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#include "InterpDefs.h" 23ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 2448f1824fd36241067e7bed2302cc00b2d880be7fBill Buzbee#define JIT_PROF_SIZE 512 251efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng 261efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng#define JIT_MAX_TRACE_LEN 100 271efc9c5e4c5c4c2fccde18e5771c68d064c33bd3Ben Cheng 28ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 29ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * JitTable hash function. 30ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 312717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee 322717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeestatic inline u4 dvmJitHashMask( const u2* p, u4 mask ) { 332717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee return ((((u4)p>>12)^(u4)p)>>1) & (mask); 342717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee} 352717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee 36ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengstatic inline u4 dvmJitHash( const u2* p ) { 372717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee return dvmJitHashMask( p, gDvmJit.jitTableMask ); 38ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} 39ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 40ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng/* 41ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng * Entries in the JIT's address lookup hash table. 42716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee * Fields which may be updated by multiple threads packed into a 43716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee * single 32-bit word to allow use of atomic update. 44ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng */ 45716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee 46716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbeetypedef struct JitEntryInfo { 47716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int traceRequested:1; /* already requested a translation */ 48716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int isMethodEntry:1; 49716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int inlineCandidate:1; 50716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int profileEnabled:1; 51716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee JitInstructionSetType instructionSet:4; 52716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee unsigned int unused:8; 53716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee u2 chain; /* Index of next in chain */ 54716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee} JitEntryInfo; 55716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee 56716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbeetypedef union JitEntryInfoUnion { 57716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee JitEntryInfo info; 58716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee volatile int infoWord; 59716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee} JitEntryInfoUnion; 60716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee 61ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengtypedef struct JitEntry { 62716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbee JitEntryInfoUnion u; 63ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng u2 chain; /* Index of next in chain */ 64ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng const u2* dPC; /* Dalvik code address */ 65ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng void* codeAddress; /* Code address of native translation */ 66ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng} JitEntry; 67ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 68ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengint dvmJitStartup(void); 69ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengvoid dvmJitShutdown(void); 70ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengint dvmCheckJit(const u2* pc, Thread* self, InterpState* interpState); 71ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengvoid* dvmJitGetCodeAddr(const u2* dPC); 72ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Chengbool dvmJitCheckTraceRequest(Thread* self, InterpState* interpState); 732717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeevoid dvmJitStopTranslationRequests(void); 742717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeevoid dvmJitStats(void); 752717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeebool dvmJitResizeJitTable(unsigned int size); 762717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbeestruct JitEntry *dvmFindJitEntry(const u2* pc); 7750a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbees8 dvmJitd2l(double d); 7850a6bf2f01efba0acbff9bb03e7ee09688553e08Bill Buzbees8 dvmJitf2l(float f); 79716f120d7f33ca18a5dcbef811399df0cbefe5d0Bill Buzbeevoid dvmJitSetCodeAddr(const u2* dPC, void *nPC, JitInstructionSetType set); 802717622484eb0f7ad537275f7260b2f93324eda2Bill Buzbee 81ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng 82ba4fc8bfc1bccae048403bd1cea3b869dca61dd7Ben Cheng#endif /*_DALVIK_INTERP_JIT*/ 83