[JAEGER] Added monomorphic inline cache for reads of unbound globals.
[mozilla-central.git] / js / src / methodjit / StubCompiler.h
blob2afab8d4573fa6ae2e4a310fa7fe4dfe5c333d8d
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 * vim: set ts=4 sw=4 et tw=99:
4 * ***** BEGIN LICENSE BLOCK *****
5 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
7 * The contents of this file are subject to the Mozilla Public License Version
8 * 1.1 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://www.mozilla.org/MPL/
12 * Software distributed under the License is distributed on an "AS IS" basis,
13 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14 * for the specific language governing rights and limitations under the
15 * License.
17 * The Original Code is Mozilla SpiderMonkey JavaScript 1.9 code, released
18 * May 28, 2008.
20 * The Initial Developer of the Original Code is
21 * Brendan Eich <brendan@mozilla.org>
23 * Contributor(s):
24 * David Anderson <danderson@mozilla.com>
25 * David Mandelin <dmandelin@mozilla.com>
27 * Alternatively, the contents of this file may be used under the terms of
28 * either of the GNU General Public License Version 2 or later (the "GPL"),
29 * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
30 * in which case the provisions of the GPL or the LGPL are applicable instead
31 * of those above. If you wish to allow use of your version of this file only
32 * under the terms of either the GPL or the LGPL, and not to allow others to
33 * use your version of this file under the terms of the MPL, indicate your
34 * decision by deleting the provisions above and replace them with the notice
35 * and other provisions required by the GPL or the LGPL. If you do not delete
36 * the provisions above, a recipient may use your version of this file under
37 * the terms of any one of the MPL, the GPL or the LGPL.
39 * ***** END LICENSE BLOCK ***** */
41 #if !defined(jsstub_compiler_h__) && defined(JS_METHODJIT)
42 #define jsstub_compiler_h__
44 #include "jscntxt.h"
45 #include "jstl.h"
46 #include "MethodJIT.h"
47 #include "methodjit/FrameState.h"
48 #include "methodjit/nunbox/Assembler.h"
49 #include "CodeGenIncludes.h"
51 namespace js {
52 namespace mjit {
54 class Compiler;
56 class StubCompiler
58 typedef JSC::MacroAssembler::Call Call;
59 typedef JSC::MacroAssembler::Jump Jump;
60 typedef JSC::MacroAssembler::Label Label;
62 struct CrossPatch {
63 CrossPatch(Jump from, Label to)
64 : from(from), to(to)
65 { }
67 Jump from;
68 Label to;
71 struct CrossJumpInScript {
72 CrossJumpInScript(Jump from, jsbytecode *pc)
73 : from(from), pc(pc)
74 { }
76 Jump from;
77 jsbytecode *pc;
80 JSContext *cx;
81 Compiler &cc;
82 FrameState &frame;
83 JSScript *script;
85 public:
86 Assembler masm;
88 private:
89 uint32 generation;
90 uint32 lastGeneration;
92 /* :TODO: oom check */
93 Vector<CrossPatch, 64, SystemAllocPolicy> exits;
94 Vector<CrossPatch, 64, SystemAllocPolicy> joins;
95 Vector<CrossJumpInScript, 64, SystemAllocPolicy> scriptJoins;
96 Vector<Jump, 8, SystemAllocPolicy> jumpList;
98 public:
99 StubCompiler(JSContext *cx, mjit::Compiler &cc, FrameState &frame, JSScript *script);
101 bool init(uint32 nargs);
103 size_t size() {
104 return masm.size();
107 uint8 *buffer() {
108 return masm.buffer();
111 Call vpInc(JSOp op, uint32 depth);
113 #define STUB_CALL_TYPE(type) \
114 Call call(type stub) { \
115 return stubCall(JS_FUNC_TO_DATA_PTR(void *, stub)); \
118 STUB_CALL_TYPE(JSObjStub);
119 STUB_CALL_TYPE(VoidStub);
120 STUB_CALL_TYPE(VoidStubUInt32);
121 STUB_CALL_TYPE(BoolStub);
123 #undef STUB_CALL_TYPE
125 /* Exits from the fast path into the slow path. */
126 void linkExit(Jump j);
128 void leave();
129 void leaveWithDepth(uint32 depth);
132 * Rejoins slow-path code back to the fast-path. The invalidation param
133 * specifies how many stack slots below sp must not be reloaded from
134 * registers.
136 void rejoin(uint32 invalidationDepth);
138 /* Finish all native code patching. */
139 void fixCrossJumps(uint8 *ncode, size_t offset, size_t total);
140 void finalize(uint8 *ncode);
141 void jumpInScript(Jump j, jsbytecode *target);
142 void crossJump(Jump j, Label l);
144 private:
145 Call stubCall(void *ptr);
146 Call stubCall(void *ptr, uint32 slots);
149 } /* namepsace mjit */
150 } /* namespace js */
152 #endif /* jsstub_compiler_h__ */