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
17 * The Original Code is Mozilla SpiderMonkey JavaScript 1.9 code, released
20 * The Initial Developer of the Original Code is
21 * Brendan Eich <brendan@mozilla.org>
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__
46 #include "MethodJIT.h"
47 #include "methodjit/FrameState.h"
48 #include "methodjit/nunbox/Assembler.h"
49 #include "CodeGenIncludes.h"
58 typedef JSC::MacroAssembler::Call Call
;
59 typedef JSC::MacroAssembler::Jump Jump
;
60 typedef JSC::MacroAssembler::Label Label
;
63 CrossPatch(Jump from
, Label to
)
71 struct CrossJumpInScript
{
72 CrossJumpInScript(Jump from
, jsbytecode
*pc
)
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
;
99 StubCompiler(JSContext
*cx
, mjit::Compiler
&cc
, FrameState
&frame
, JSScript
*script
);
101 bool init(uint32 nargs
);
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
);
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
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
);
145 Call
stubCall(void *ptr
);
146 Call
stubCall(void *ptr
, uint32 slots
);
149 } /* namepsace mjit */
152 #endif /* jsstub_compiler_h__ */