1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 : * vim: set ts=4 sw=4 et tw=99:
3 : *
4 : * ***** BEGIN LICENSE BLOCK *****
5 : * Version: MPL 1.1/GPL 2.0/LGPL 2.1
6 : *
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/
11 : *
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.
16 : *
17 : * The Original Code is Mozilla SpiderMonkey JavaScript 1.9 code, released
18 : * May 28, 2008.
19 : *
20 : * The Initial Developer of the Original Code is
21 : * Brendan Eich <brendan@mozilla.org>
22 : *
23 : * Contributor(s):
24 : * David Anderson <danderson@mozilla.com>
25 : *
26 : * Alternatively, the contents of this file may be used under the terms of
27 : * either of the GNU General Public License Version 2 or later (the "GPL"),
28 : * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29 : * in which case the provisions of the GPL or the LGPL are applicable instead
30 : * of those above. If you wish to allow use of your version of this file only
31 : * under the terms of either the GPL or the LGPL, and not to allow others to
32 : * use your version of this file under the terms of the MPL, indicate your
33 : * decision by deleting the provisions above and replace them with the notice
34 : * and other provisions required by the GPL or the LGPL. If you do not delete
35 : * the provisions above, a recipient may use your version of this file under
36 : * the terms of any one of the MPL, the GPL or the LGPL.
37 : *
38 : * ***** END LICENSE BLOCK ***** */
39 :
40 : #if !defined jsjaeger_imm_sync_h__ && defined JS_METHODJIT && defined JS_NUNBOX32
41 : #define jsjaeger_imm_sync_h__
42 :
43 : #include "methodjit/MachineRegs.h"
44 : #include "methodjit/FrameEntry.h"
45 : #include "CodeGenIncludes.h"
46 :
47 : namespace js {
48 : namespace mjit {
49 :
50 : class FrameState;
51 :
52 : /*
53 : * This is a structure nestled within the FrameState used for safely syncing
54 : * registers to memory during transitions from the fast path into a slow path
55 : * stub call. During this process, the frame itself is immutable, and we may
56 : * run out of registers needed to remat copies.
57 : *
58 : * This structure maintains a mapping of the tracker used to perform ad-hoc
59 : * register allocation.
60 : */
61 : class ImmutableSync
62 : {
63 : typedef JSC::MacroAssembler::RegisterID RegisterID;
64 : typedef JSC::MacroAssembler::Address Address;
65 :
66 : struct SyncEntry {
67 : /*
68 : * NB: clobbered and sync mean the same thing: the register associated
69 : * in the FrameEntry is no longer valid, and has been written back.
70 : *
71 : * They are separated for readability.
72 : */
73 : uint32_t generation;
74 : bool dataClobbered;
75 : bool typeClobbered;
76 : bool hasDataReg;
77 : bool hasTypeReg;
78 : bool learnedType;
79 : RegisterID dataReg;
80 : RegisterID typeReg;
81 : JSValueType type;
82 :
83 557367 : void reset(uint32_t gen) {
84 557367 : dataClobbered = false;
85 557367 : typeClobbered = false;
86 557367 : hasDataReg = false;
87 557367 : hasTypeReg = false;
88 557367 : learnedType = false;
89 557367 : generation = gen;
90 557367 : }
91 : };
92 :
93 : public:
94 : ImmutableSync();
95 : ~ImmutableSync();
96 : bool init(JSContext *cx, const FrameState &frame, uint32_t nentries);
97 :
98 : void reset(Assembler *masm, Registers avail, FrameEntry *top, FrameEntry *bottom);
99 : void sync(FrameEntry *fe);
100 :
101 : private:
102 : void syncCopy(FrameEntry *fe);
103 : void syncNormal(FrameEntry *fe);
104 : RegisterID ensureDataReg(FrameEntry *fe, SyncEntry &e);
105 : RegisterID ensureTypeReg(FrameEntry *fe, SyncEntry &e);
106 :
107 : RegisterID allocReg();
108 : void freeReg(RegisterID reg);
109 :
110 : /* To be called only by allocReg. */
111 : RegisterID doAllocReg();
112 :
113 : inline SyncEntry &entryFor(FrameEntry *fe);
114 :
115 : bool shouldSyncType(FrameEntry *fe, SyncEntry &e);
116 : bool shouldSyncData(FrameEntry *fe, SyncEntry &e);
117 :
118 : private:
119 : JSContext *cx;
120 : SyncEntry *entries;
121 : const FrameState *frame;
122 : uint32_t nentries;
123 : Registers avail;
124 : Assembler *masm;
125 : SyncEntry *regs[Assembler::TotalRegisters];
126 : FrameEntry *top;
127 : FrameEntry *bottom;
128 : uint32_t generation;
129 : };
130 :
131 : } /* namespace mjit */
132 : } /* namespace js */
133 :
134 : #endif /* jsjaeger_imm_sync_h__ */
135 :
|