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