Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
2 * vim: set ts=8 sts=4 et sw=4 tw=99:
3 * This Source Code Form is subject to the terms of the Mozilla Public
4 * License, v. 2.0. If a copy of the MPL was not distributed with this
5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
7 #ifndef jit_Lowering_h
8 #define jit_Lowering_h
10 // This file declares the structures that are used for attaching LIR to a
11 // MIRGraph.
13 #include "jit/LIR.h"
14 #if defined(JS_CODEGEN_X86)
15 # include "jit/x86/Lowering-x86.h"
16 #elif defined(JS_CODEGEN_X64)
17 # include "jit/x64/Lowering-x64.h"
18 #elif defined(JS_CODEGEN_ARM)
19 # include "jit/arm/Lowering-arm.h"
20 #elif defined(JS_CODEGEN_MIPS)
21 # include "jit/mips/Lowering-mips.h"
22 #else
23 # error "Unknown architecture!"
24 #endif
26 namespace js {
27 namespace jit {
29 class LIRGenerator : public LIRGeneratorSpecific
30 {
31 void updateResumeState(MInstruction *ins);
32 void updateResumeState(MBasicBlock *block);
34 // The maximum depth, for framesizeclass determination.
35 uint32_t maxargslots_;
37 public:
38 LIRGenerator(MIRGenerator *gen, MIRGraph &graph, LIRGraph &lirGraph)
39 : LIRGeneratorSpecific(gen, graph, lirGraph),
40 maxargslots_(0)
41 { }
43 bool generate();
45 private:
47 bool useBoxAtStart(LInstruction *lir, size_t n, MDefinition *mir,
48 LUse::Policy policy = LUse::REGISTER) {
49 return useBox(lir, n, mir, policy, true);
50 }
52 bool lowerBitOp(JSOp op, MInstruction *ins);
53 bool lowerShiftOp(JSOp op, MShiftInstruction *ins);
54 bool lowerBinaryV(JSOp op, MBinaryInstruction *ins);
55 bool precreatePhi(LBlock *block, MPhi *phi);
56 bool definePhis();
58 bool lowerCallArguments(MCall *call);
60 public:
61 bool visitInstruction(MInstruction *ins);
62 bool visitBlock(MBasicBlock *block);
64 // Visitor hooks are explicit, to give CPU-specific versions a chance to
65 // intercept without a bunch of explicit gunk in the .cpp.
66 bool visitCloneLiteral(MCloneLiteral *ins);
67 bool visitParameter(MParameter *param);
68 bool visitCallee(MCallee *callee);
69 bool visitGoto(MGoto *ins);
70 bool visitTableSwitch(MTableSwitch *tableswitch);
71 bool visitNewSlots(MNewSlots *ins);
72 bool visitNewArray(MNewArray *ins);
73 bool visitNewObject(MNewObject *ins);
74 bool visitNewDeclEnvObject(MNewDeclEnvObject *ins);
75 bool visitNewCallObject(MNewCallObject *ins);
76 bool visitNewRunOnceCallObject(MNewRunOnceCallObject *ins);
77 bool visitNewStringObject(MNewStringObject *ins);
78 bool visitNewDerivedTypedObject(MNewDerivedTypedObject *ins);
79 bool visitNewPar(MNewPar *ins);
80 bool visitNewCallObjectPar(MNewCallObjectPar *ins);
81 bool visitNewDenseArrayPar(MNewDenseArrayPar *ins);
82 bool visitAbortPar(MAbortPar *ins);
83 bool visitInitElem(MInitElem *ins);
84 bool visitInitElemGetterSetter(MInitElemGetterSetter *ins);
85 bool visitMutateProto(MMutateProto *ins);
86 bool visitInitProp(MInitProp *ins);
87 bool visitInitPropGetterSetter(MInitPropGetterSetter *ins);
88 bool visitCheckOverRecursed(MCheckOverRecursed *ins);
89 bool visitCheckOverRecursedPar(MCheckOverRecursedPar *ins);
90 bool visitDefVar(MDefVar *ins);
91 bool visitDefFun(MDefFun *ins);
92 bool visitCreateThisWithTemplate(MCreateThisWithTemplate *ins);
93 bool visitCreateThisWithProto(MCreateThisWithProto *ins);
94 bool visitCreateThis(MCreateThis *ins);
95 bool visitCreateArgumentsObject(MCreateArgumentsObject *ins);
96 bool visitGetArgumentsObjectArg(MGetArgumentsObjectArg *ins);
97 bool visitSetArgumentsObjectArg(MSetArgumentsObjectArg *ins);
98 bool visitReturnFromCtor(MReturnFromCtor *ins);
99 bool visitComputeThis(MComputeThis *ins);
100 bool visitLoadArrowThis(MLoadArrowThis *ins);
101 bool visitCall(MCall *call);
102 bool visitApplyArgs(MApplyArgs *apply);
103 bool visitArraySplice(MArraySplice *splice);
104 bool visitBail(MBail *bail);
105 bool visitAssertFloat32(MAssertFloat32 *ins);
106 bool visitGetDynamicName(MGetDynamicName *ins);
107 bool visitFilterArgumentsOrEval(MFilterArgumentsOrEval *ins);
108 bool visitCallDirectEval(MCallDirectEval *ins);
109 bool visitTest(MTest *test);
110 bool visitFunctionDispatch(MFunctionDispatch *ins);
111 bool visitTypeObjectDispatch(MTypeObjectDispatch *ins);
112 bool visitCompare(MCompare *comp);
113 bool visitTypeOf(MTypeOf *ins);
114 bool visitToId(MToId *ins);
115 bool visitBitNot(MBitNot *ins);
116 bool visitBitAnd(MBitAnd *ins);
117 bool visitBitOr(MBitOr *ins);
118 bool visitBitXor(MBitXor *ins);
119 bool visitLsh(MLsh *ins);
120 bool visitRsh(MRsh *ins);
121 bool visitUrsh(MUrsh *ins);
122 bool visitFloor(MFloor *ins);
123 bool visitRound(MRound *ins);
124 bool visitMinMax(MMinMax *ins);
125 bool visitAbs(MAbs *ins);
126 bool visitSqrt(MSqrt *ins);
127 bool visitAtan2(MAtan2 *ins);
128 bool visitHypot(MHypot *ins);
129 bool visitPow(MPow *ins);
130 bool visitRandom(MRandom *ins);
131 bool visitMathFunction(MMathFunction *ins);
132 bool visitAdd(MAdd *ins);
133 bool visitSub(MSub *ins);
134 bool visitMul(MMul *ins);
135 bool visitDiv(MDiv *ins);
136 bool visitMod(MMod *ins);
137 bool visitConcat(MConcat *ins);
138 bool visitConcatPar(MConcatPar *ins);
139 bool visitCharCodeAt(MCharCodeAt *ins);
140 bool visitFromCharCode(MFromCharCode *ins);
141 bool visitStringSplit(MStringSplit *ins);
142 bool visitStart(MStart *start);
143 bool visitOsrEntry(MOsrEntry *entry);
144 bool visitNop(MNop *nop);
145 bool visitOsrValue(MOsrValue *value);
146 bool visitOsrScopeChain(MOsrScopeChain *object);
147 bool visitOsrReturnValue(MOsrReturnValue *value);
148 bool visitOsrArgumentsObject(MOsrArgumentsObject *object);
149 bool visitToDouble(MToDouble *convert);
150 bool visitToFloat32(MToFloat32 *convert);
151 bool visitToInt32(MToInt32 *convert);
152 bool visitTruncateToInt32(MTruncateToInt32 *truncate);
153 bool visitToString(MToString *convert);
154 bool visitRegExp(MRegExp *ins);
155 bool visitRegExpExec(MRegExpExec *ins);
156 bool visitRegExpTest(MRegExpTest *ins);
157 bool visitRegExpReplace(MRegExpReplace *ins);
158 bool visitStringReplace(MStringReplace *ins);
159 bool visitLambda(MLambda *ins);
160 bool visitLambdaArrow(MLambdaArrow *ins);
161 bool visitLambdaPar(MLambdaPar *ins);
162 bool visitImplicitThis(MImplicitThis *ins);
163 bool visitSlots(MSlots *ins);
164 bool visitElements(MElements *ins);
165 bool visitConstantElements(MConstantElements *ins);
166 bool visitConvertElementsToDoubles(MConvertElementsToDoubles *ins);
167 bool visitMaybeToDoubleElement(MMaybeToDoubleElement *ins);
168 bool visitLoadSlot(MLoadSlot *ins);
169 bool visitFunctionEnvironment(MFunctionEnvironment *ins);
170 bool visitForkJoinContext(MForkJoinContext *ins);
171 bool visitGuardThreadExclusive(MGuardThreadExclusive *ins);
172 bool visitInterruptCheck(MInterruptCheck *ins);
173 bool visitInterruptCheckPar(MInterruptCheckPar *ins);
174 bool visitStoreSlot(MStoreSlot *ins);
175 bool visitFilterTypeSet(MFilterTypeSet *ins);
176 bool visitTypeBarrier(MTypeBarrier *ins);
177 bool visitMonitorTypes(MMonitorTypes *ins);
178 bool visitPostWriteBarrier(MPostWriteBarrier *ins);
179 bool visitArrayLength(MArrayLength *ins);
180 bool visitSetArrayLength(MSetArrayLength *ins);
181 bool visitTypedArrayLength(MTypedArrayLength *ins);
182 bool visitTypedArrayElements(MTypedArrayElements *ins);
183 bool visitNeuterCheck(MNeuterCheck *lir);
184 bool visitTypedObjectElements(MTypedObjectElements *ins);
185 bool visitSetTypedObjectOffset(MSetTypedObjectOffset *ins);
186 bool visitInitializedLength(MInitializedLength *ins);
187 bool visitSetInitializedLength(MSetInitializedLength *ins);
188 bool visitNot(MNot *ins);
189 bool visitBoundsCheck(MBoundsCheck *ins);
190 bool visitBoundsCheckLower(MBoundsCheckLower *ins);
191 bool visitLoadElement(MLoadElement *ins);
192 bool visitLoadElementHole(MLoadElementHole *ins);
193 bool visitStoreElement(MStoreElement *ins);
194 bool visitStoreElementHole(MStoreElementHole *ins);
195 bool visitEffectiveAddress(MEffectiveAddress *ins);
196 bool visitArrayPopShift(MArrayPopShift *ins);
197 bool visitArrayPush(MArrayPush *ins);
198 bool visitArrayConcat(MArrayConcat *ins);
199 bool visitLoadTypedArrayElement(MLoadTypedArrayElement *ins);
200 bool visitLoadTypedArrayElementHole(MLoadTypedArrayElementHole *ins);
201 bool visitLoadTypedArrayElementStatic(MLoadTypedArrayElementStatic *ins);
202 bool visitStoreTypedArrayElement(MStoreTypedArrayElement *ins);
203 bool visitStoreTypedArrayElementHole(MStoreTypedArrayElementHole *ins);
204 bool visitClampToUint8(MClampToUint8 *ins);
205 bool visitLoadFixedSlot(MLoadFixedSlot *ins);
206 bool visitStoreFixedSlot(MStoreFixedSlot *ins);
207 bool visitGetPropertyCache(MGetPropertyCache *ins);
208 bool visitGetPropertyPolymorphic(MGetPropertyPolymorphic *ins);
209 bool visitSetPropertyPolymorphic(MSetPropertyPolymorphic *ins);
210 bool visitGetElementCache(MGetElementCache *ins);
211 bool visitBindNameCache(MBindNameCache *ins);
212 bool visitGuardObjectIdentity(MGuardObjectIdentity *ins);
213 bool visitGuardClass(MGuardClass *ins);
214 bool visitGuardObject(MGuardObject *ins);
215 bool visitGuardString(MGuardString *ins);
216 bool visitAssertRange(MAssertRange *ins);
217 bool visitCallGetProperty(MCallGetProperty *ins);
218 bool visitDeleteProperty(MDeleteProperty *ins);
219 bool visitDeleteElement(MDeleteElement *ins);
220 bool visitGetNameCache(MGetNameCache *ins);
221 bool visitCallGetIntrinsicValue(MCallGetIntrinsicValue *ins);
222 bool visitCallsiteCloneCache(MCallsiteCloneCache *ins);
223 bool visitCallGetElement(MCallGetElement *ins);
224 bool visitCallSetElement(MCallSetElement *ins);
225 bool visitCallInitElementArray(MCallInitElementArray *ins);
226 bool visitSetPropertyCache(MSetPropertyCache *ins);
227 bool visitSetElementCache(MSetElementCache *ins);
228 bool visitCallSetProperty(MCallSetProperty *ins);
229 bool visitIteratorStart(MIteratorStart *ins);
230 bool visitIteratorNext(MIteratorNext *ins);
231 bool visitIteratorMore(MIteratorMore *ins);
232 bool visitIteratorEnd(MIteratorEnd *ins);
233 bool visitStringLength(MStringLength *ins);
234 bool visitArgumentsLength(MArgumentsLength *ins);
235 bool visitGetFrameArgument(MGetFrameArgument *ins);
236 bool visitSetFrameArgument(MSetFrameArgument *ins);
237 bool visitRunOncePrologue(MRunOncePrologue *ins);
238 bool visitRest(MRest *ins);
239 bool visitRestPar(MRestPar *ins);
240 bool visitThrow(MThrow *ins);
241 bool visitIn(MIn *ins);
242 bool visitInArray(MInArray *ins);
243 bool visitInstanceOf(MInstanceOf *ins);
244 bool visitCallInstanceOf(MCallInstanceOf *ins);
245 bool visitProfilerStackOp(MProfilerStackOp *ins);
246 bool visitIsCallable(MIsCallable *ins);
247 bool visitHaveSameClass(MHaveSameClass *ins);
248 bool visitHasClass(MHasClass *ins);
249 bool visitAsmJSLoadGlobalVar(MAsmJSLoadGlobalVar *ins);
250 bool visitAsmJSStoreGlobalVar(MAsmJSStoreGlobalVar *ins);
251 bool visitAsmJSLoadFFIFunc(MAsmJSLoadFFIFunc *ins);
252 bool visitAsmJSParameter(MAsmJSParameter *ins);
253 bool visitAsmJSReturn(MAsmJSReturn *ins);
254 bool visitAsmJSVoidReturn(MAsmJSVoidReturn *ins);
255 bool visitAsmJSPassStackArg(MAsmJSPassStackArg *ins);
256 bool visitAsmJSCall(MAsmJSCall *ins);
257 bool visitSetDOMProperty(MSetDOMProperty *ins);
258 bool visitGetDOMProperty(MGetDOMProperty *ins);
259 bool visitGetDOMMember(MGetDOMMember *ins);
260 bool visitRecompileCheck(MRecompileCheck *ins);
261 };
263 } // namespace jit
264 } // namespace js
266 #endif /* jit_Lowering_h */