|
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/. */ |
|
6 |
|
7 #ifndef jit_Lowering_h |
|
8 #define jit_Lowering_h |
|
9 |
|
10 // This file declares the structures that are used for attaching LIR to a |
|
11 // MIRGraph. |
|
12 |
|
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 |
|
25 |
|
26 namespace js { |
|
27 namespace jit { |
|
28 |
|
29 class LIRGenerator : public LIRGeneratorSpecific |
|
30 { |
|
31 void updateResumeState(MInstruction *ins); |
|
32 void updateResumeState(MBasicBlock *block); |
|
33 |
|
34 // The maximum depth, for framesizeclass determination. |
|
35 uint32_t maxargslots_; |
|
36 |
|
37 public: |
|
38 LIRGenerator(MIRGenerator *gen, MIRGraph &graph, LIRGraph &lirGraph) |
|
39 : LIRGeneratorSpecific(gen, graph, lirGraph), |
|
40 maxargslots_(0) |
|
41 { } |
|
42 |
|
43 bool generate(); |
|
44 |
|
45 private: |
|
46 |
|
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 } |
|
51 |
|
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(); |
|
57 |
|
58 bool lowerCallArguments(MCall *call); |
|
59 |
|
60 public: |
|
61 bool visitInstruction(MInstruction *ins); |
|
62 bool visitBlock(MBasicBlock *block); |
|
63 |
|
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 }; |
|
262 |
|
263 } // namespace jit |
|
264 } // namespace js |
|
265 |
|
266 #endif /* jit_Lowering_h */ |