Line data Source code
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_ARM64)
21 : # include "jit/arm64/Lowering-arm64.h"
22 : #elif defined(JS_CODEGEN_MIPS32)
23 : # include "jit/mips32/Lowering-mips32.h"
24 : #elif defined(JS_CODEGEN_MIPS64)
25 : # include "jit/mips64/Lowering-mips64.h"
26 : #elif defined(JS_CODEGEN_NONE)
27 : # include "jit/none/Lowering-none.h"
28 : #else
29 : # error "Unknown architecture!"
30 : #endif
31 :
32 : namespace js {
33 : namespace jit {
34 :
35 : class LIRGenerator : public LIRGeneratorSpecific
36 : {
37 : void updateResumeState(MInstruction* ins);
38 : void updateResumeState(MBasicBlock* block);
39 :
40 : // The maximum depth, for framesizeclass determination.
41 : uint32_t maxargslots_;
42 :
43 : public:
44 8 : LIRGenerator(MIRGenerator* gen, MIRGraph& graph, LIRGraph& lirGraph)
45 8 : : LIRGeneratorSpecific(gen, graph, lirGraph),
46 8 : maxargslots_(0)
47 8 : { }
48 :
49 : MOZ_MUST_USE bool generate();
50 :
51 : private:
52 0 : LBoxAllocation useBoxFixedAtStart(MDefinition* mir, Register reg1, Register reg2) {
53 0 : return useBoxFixed(mir, reg1, reg2, /* useAtStart = */ true);
54 : }
55 :
56 : LBoxAllocation useBoxFixedAtStart(MDefinition* mir, ValueOperand op);
57 : LBoxAllocation useBoxAtStart(MDefinition* mir, LUse::Policy policy = LUse::REGISTER);
58 :
59 : void lowerBitOp(JSOp op, MInstruction* ins);
60 : void lowerShiftOp(JSOp op, MShiftInstruction* ins);
61 : void lowerBinaryV(JSOp op, MBinaryInstruction* ins);
62 : void definePhis();
63 :
64 : MOZ_MUST_USE bool lowerCallArguments(MCall* call);
65 :
66 : public:
67 : MOZ_MUST_USE bool visitInstruction(MInstruction* ins);
68 : MOZ_MUST_USE bool visitBlock(MBasicBlock* block);
69 :
70 : // Visitor hooks are explicit, to give CPU-specific versions a chance to
71 : // intercept without a bunch of explicit gunk in the .cpp.
72 : void visitCloneLiteral(MCloneLiteral* ins);
73 : void visitParameter(MParameter* param);
74 : void visitCallee(MCallee* callee);
75 : void visitIsConstructing(MIsConstructing* ins);
76 : void visitGoto(MGoto* ins);
77 : void visitTableSwitch(MTableSwitch* tableswitch);
78 : void visitNewArray(MNewArray* ins);
79 : void visitNewArrayCopyOnWrite(MNewArrayCopyOnWrite* ins);
80 : void visitNewArrayDynamicLength(MNewArrayDynamicLength* ins);
81 : void visitNewIterator(MNewIterator* ins);
82 : void visitNewTypedArray(MNewTypedArray* ins);
83 : void visitNewTypedArrayDynamicLength(MNewTypedArrayDynamicLength* ins);
84 : void visitNewObject(MNewObject* ins);
85 : void visitNewTypedObject(MNewTypedObject* ins);
86 : void visitNewNamedLambdaObject(MNewNamedLambdaObject* ins);
87 : void visitNewCallObject(MNewCallObject* ins);
88 : void visitNewSingletonCallObject(MNewSingletonCallObject* ins);
89 : void visitNewStringObject(MNewStringObject* ins);
90 : void visitNewDerivedTypedObject(MNewDerivedTypedObject* ins);
91 : void visitInitElem(MInitElem* ins);
92 : void visitInitElemGetterSetter(MInitElemGetterSetter* ins);
93 : void visitMutateProto(MMutateProto* ins);
94 : void visitInitProp(MInitProp* ins);
95 : void visitInitPropGetterSetter(MInitPropGetterSetter* ins);
96 : void visitCheckOverRecursed(MCheckOverRecursed* ins);
97 : void visitDefVar(MDefVar* ins);
98 : void visitDefLexical(MDefLexical* ins);
99 : void visitDefFun(MDefFun* ins);
100 : void visitCreateThisWithTemplate(MCreateThisWithTemplate* ins);
101 : void visitCreateThisWithProto(MCreateThisWithProto* ins);
102 : void visitCreateThis(MCreateThis* ins);
103 : void visitCreateArgumentsObject(MCreateArgumentsObject* ins);
104 : void visitGetArgumentsObjectArg(MGetArgumentsObjectArg* ins);
105 : void visitSetArgumentsObjectArg(MSetArgumentsObjectArg* ins);
106 : void visitReturnFromCtor(MReturnFromCtor* ins);
107 : void visitComputeThis(MComputeThis* ins);
108 : void visitCall(MCall* call);
109 : void visitApplyArgs(MApplyArgs* apply);
110 : void visitApplyArray(MApplyArray* apply);
111 : void visitBail(MBail* bail);
112 : void visitUnreachable(MUnreachable* unreachable);
113 : void visitEncodeSnapshot(MEncodeSnapshot* ins);
114 : void visitAssertFloat32(MAssertFloat32* ins);
115 : void visitAssertRecoveredOnBailout(MAssertRecoveredOnBailout* ins);
116 : void visitGetDynamicName(MGetDynamicName* ins);
117 : void visitCallDirectEval(MCallDirectEval* ins);
118 : void visitTest(MTest* test);
119 : void visitGotoWithFake(MGotoWithFake* ins);
120 : void visitFunctionDispatch(MFunctionDispatch* ins);
121 : void visitObjectGroupDispatch(MObjectGroupDispatch* ins);
122 : void visitCompare(MCompare* comp);
123 : void visitTypeOf(MTypeOf* ins);
124 : void visitToAsync(MToAsync* ins);
125 : void visitToAsyncGen(MToAsyncGen* ins);
126 : void visitToAsyncIter(MToAsyncIter* ins);
127 : void visitToId(MToId* ins);
128 : void visitBitNot(MBitNot* ins);
129 : void visitBitAnd(MBitAnd* ins);
130 : void visitBitOr(MBitOr* ins);
131 : void visitBitXor(MBitXor* ins);
132 : void visitLsh(MLsh* ins);
133 : void visitRsh(MRsh* ins);
134 : void visitUrsh(MUrsh* ins);
135 : void visitSignExtend(MSignExtend* ins);
136 : void visitRotate(MRotate* ins);
137 : void visitFloor(MFloor* ins);
138 : void visitCeil(MCeil* ins);
139 : void visitRound(MRound* ins);
140 : void visitNearbyInt(MNearbyInt* ins);
141 : void visitMinMax(MMinMax* ins);
142 : void visitAbs(MAbs* ins);
143 : void visitClz(MClz* ins);
144 : void visitCtz(MCtz* ins);
145 : void visitSqrt(MSqrt* ins);
146 : void visitPopcnt(MPopcnt* ins);
147 : void visitAtan2(MAtan2* ins);
148 : void visitHypot(MHypot* ins);
149 : void visitPow(MPow* ins);
150 : void visitMathFunction(MMathFunction* ins);
151 : void visitAdd(MAdd* ins);
152 : void visitSub(MSub* ins);
153 : void visitMul(MMul* ins);
154 : void visitDiv(MDiv* ins);
155 : void visitMod(MMod* ins);
156 : void visitConcat(MConcat* ins);
157 : void visitCharCodeAt(MCharCodeAt* ins);
158 : void visitFromCharCode(MFromCharCode* ins);
159 : void visitFromCodePoint(MFromCodePoint* ins);
160 : void visitSinCos(MSinCos *ins);
161 : void visitStringSplit(MStringSplit* ins);
162 : void visitStart(MStart* start);
163 : void visitOsrEntry(MOsrEntry* entry);
164 : void visitNop(MNop* nop);
165 : void visitLimitedTruncate(MLimitedTruncate* nop);
166 : void visitOsrValue(MOsrValue* value);
167 : void visitOsrEnvironmentChain(MOsrEnvironmentChain* object);
168 : void visitOsrReturnValue(MOsrReturnValue* value);
169 : void visitOsrArgumentsObject(MOsrArgumentsObject* object);
170 : void visitToDouble(MToDouble* convert);
171 : void visitToFloat32(MToFloat32* convert);
172 : void visitToInt32(MToInt32* convert);
173 : void visitTruncateToInt32(MTruncateToInt32* truncate);
174 : void visitWasmTruncateToInt32(MWasmTruncateToInt32* truncate);
175 : void visitWrapInt64ToInt32(MWrapInt64ToInt32* ins);
176 : void visitToString(MToString* convert);
177 : void visitToObjectOrNull(MToObjectOrNull* convert);
178 : void visitRegExp(MRegExp* ins);
179 : void visitRegExpMatcher(MRegExpMatcher* ins);
180 : void visitRegExpSearcher(MRegExpSearcher* ins);
181 : void visitRegExpTester(MRegExpTester* ins);
182 : void visitRegExpPrototypeOptimizable(MRegExpPrototypeOptimizable* ins);
183 : void visitRegExpInstanceOptimizable(MRegExpInstanceOptimizable* ins);
184 : void visitGetFirstDollarIndex(MGetFirstDollarIndex* ins);
185 : void visitStringReplace(MStringReplace* ins);
186 : void visitBinarySharedStub(MBinarySharedStub* ins);
187 : void visitUnarySharedStub(MUnarySharedStub* ins);
188 : void visitNullarySharedStub(MNullarySharedStub* ins);
189 : void visitLambda(MLambda* ins);
190 : void visitLambdaArrow(MLambdaArrow* ins);
191 : void visitSetFunName(MSetFunName* ins);
192 : void visitNewLexicalEnvironmentObject(MNewLexicalEnvironmentObject* ins);
193 : void visitCopyLexicalEnvironmentObject(MCopyLexicalEnvironmentObject* ins);
194 : void visitKeepAliveObject(MKeepAliveObject* ins);
195 : void visitSlots(MSlots* ins);
196 : void visitElements(MElements* ins);
197 : void visitConstantElements(MConstantElements* ins);
198 : void visitConvertElementsToDoubles(MConvertElementsToDoubles* ins);
199 : void visitMaybeToDoubleElement(MMaybeToDoubleElement* ins);
200 : void visitMaybeCopyElementsForWrite(MMaybeCopyElementsForWrite* ins);
201 : void visitLoadSlot(MLoadSlot* ins);
202 : void visitLoadFixedSlotAndUnbox(MLoadFixedSlotAndUnbox* ins);
203 : void visitFunctionEnvironment(MFunctionEnvironment* ins);
204 : void visitInterruptCheck(MInterruptCheck* ins);
205 : void visitWasmTrap(MWasmTrap* ins);
206 : void visitWasmReinterpret(MWasmReinterpret* ins);
207 : void visitStoreSlot(MStoreSlot* ins);
208 : void visitFilterTypeSet(MFilterTypeSet* ins);
209 : void visitTypeBarrier(MTypeBarrier* ins);
210 : void visitMonitorTypes(MMonitorTypes* ins);
211 : void visitPostWriteBarrier(MPostWriteBarrier* ins);
212 : void visitPostWriteElementBarrier(MPostWriteElementBarrier* ins);
213 : void visitArrayLength(MArrayLength* ins);
214 : void visitSetArrayLength(MSetArrayLength* ins);
215 : void visitGetNextEntryForIterator(MGetNextEntryForIterator* ins);
216 : void visitTypedArrayLength(MTypedArrayLength* ins);
217 : void visitTypedArrayElements(MTypedArrayElements* ins);
218 : void visitSetDisjointTypedElements(MSetDisjointTypedElements* ins);
219 : void visitTypedObjectElements(MTypedObjectElements* ins);
220 : void visitSetTypedObjectOffset(MSetTypedObjectOffset* ins);
221 : void visitTypedObjectDescr(MTypedObjectDescr* ins);
222 : void visitInitializedLength(MInitializedLength* ins);
223 : void visitSetInitializedLength(MSetInitializedLength* ins);
224 : void visitUnboxedArrayLength(MUnboxedArrayLength* ins);
225 : void visitUnboxedArrayInitializedLength(MUnboxedArrayInitializedLength* ins);
226 : void visitIncrementUnboxedArrayInitializedLength(MIncrementUnboxedArrayInitializedLength* ins);
227 : void visitSetUnboxedArrayInitializedLength(MSetUnboxedArrayInitializedLength* ins);
228 : void visitNot(MNot* ins);
229 : void visitBoundsCheck(MBoundsCheck* ins);
230 : void visitBoundsCheckLower(MBoundsCheckLower* ins);
231 : void visitLoadElement(MLoadElement* ins);
232 : void visitLoadElementHole(MLoadElementHole* ins);
233 : void visitLoadUnboxedObjectOrNull(MLoadUnboxedObjectOrNull* ins);
234 : void visitLoadUnboxedString(MLoadUnboxedString* ins);
235 : void visitStoreElement(MStoreElement* ins);
236 : void visitStoreElementHole(MStoreElementHole* ins);
237 : void visitFallibleStoreElement(MFallibleStoreElement* ins);
238 : void visitStoreUnboxedObjectOrNull(MStoreUnboxedObjectOrNull* ins);
239 : void visitStoreUnboxedString(MStoreUnboxedString* ins);
240 : void visitConvertUnboxedObjectToNative(MConvertUnboxedObjectToNative* ins);
241 : void visitEffectiveAddress(MEffectiveAddress* ins);
242 : void visitArrayPopShift(MArrayPopShift* ins);
243 : void visitArrayPush(MArrayPush* ins);
244 : void visitArraySlice(MArraySlice* ins);
245 : void visitArrayJoin(MArrayJoin* ins);
246 : void visitLoadUnboxedScalar(MLoadUnboxedScalar* ins);
247 : void visitLoadTypedArrayElementHole(MLoadTypedArrayElementHole* ins);
248 : void visitLoadTypedArrayElementStatic(MLoadTypedArrayElementStatic* ins);
249 : void visitStoreUnboxedScalar(MStoreUnboxedScalar* ins);
250 : void visitStoreTypedArrayElementHole(MStoreTypedArrayElementHole* ins);
251 : void visitClampToUint8(MClampToUint8* ins);
252 : void visitLoadFixedSlot(MLoadFixedSlot* ins);
253 : void visitStoreFixedSlot(MStoreFixedSlot* ins);
254 : void visitGetPropertyCache(MGetPropertyCache* ins);
255 : void visitGetPropertyPolymorphic(MGetPropertyPolymorphic* ins);
256 : void visitSetPropertyPolymorphic(MSetPropertyPolymorphic* ins);
257 : void visitBindNameCache(MBindNameCache* ins);
258 : void visitCallBindVar(MCallBindVar* ins);
259 : void visitGuardObjectIdentity(MGuardObjectIdentity* ins);
260 : void visitGuardClass(MGuardClass* ins);
261 : void visitGuardObject(MGuardObject* ins);
262 : void visitGuardString(MGuardString* ins);
263 : void visitGuardReceiverPolymorphic(MGuardReceiverPolymorphic* ins);
264 : void visitGuardUnboxedExpando(MGuardUnboxedExpando* ins);
265 : void visitLoadUnboxedExpando(MLoadUnboxedExpando* ins);
266 : void visitPolyInlineGuard(MPolyInlineGuard* ins);
267 : void visitAssertRange(MAssertRange* ins);
268 : void visitCallGetProperty(MCallGetProperty* ins);
269 : void visitDeleteProperty(MDeleteProperty* ins);
270 : void visitDeleteElement(MDeleteElement* ins);
271 : void visitGetNameCache(MGetNameCache* ins);
272 : void visitCallGetIntrinsicValue(MCallGetIntrinsicValue* ins);
273 : void visitCallGetElement(MCallGetElement* ins);
274 : void visitCallSetElement(MCallSetElement* ins);
275 : void visitCallInitElementArray(MCallInitElementArray* ins);
276 : void visitSetPropertyCache(MSetPropertyCache* ins);
277 : void visitCallSetProperty(MCallSetProperty* ins);
278 : void visitIteratorStart(MIteratorStart* ins);
279 : void visitIteratorMore(MIteratorMore* ins);
280 : void visitIsNoIter(MIsNoIter* ins);
281 : void visitIteratorEnd(MIteratorEnd* ins);
282 : void visitStringLength(MStringLength* ins);
283 : void visitArgumentsLength(MArgumentsLength* ins);
284 : void visitGetFrameArgument(MGetFrameArgument* ins);
285 : void visitSetFrameArgument(MSetFrameArgument* ins);
286 : void visitRunOncePrologue(MRunOncePrologue* ins);
287 : void visitRest(MRest* ins);
288 : void visitThrow(MThrow* ins);
289 : void visitInCache(MInCache* ins);
290 : void visitInArray(MInArray* ins);
291 : void visitHasOwnCache(MHasOwnCache* ins);
292 : void visitInstanceOf(MInstanceOf* ins);
293 : void visitCallInstanceOf(MCallInstanceOf* ins);
294 : void visitIsCallable(MIsCallable* ins);
295 : void visitIsConstructor(MIsConstructor* ins);
296 : void visitIsArray(MIsArray* ins);
297 : void visitIsObject(MIsObject* ins);
298 : void visitHasClass(MHasClass* ins);
299 : void visitWasmAddOffset(MWasmAddOffset* ins);
300 : void visitWasmLoadTls(MWasmLoadTls* ins);
301 : void visitWasmBoundsCheck(MWasmBoundsCheck* ins);
302 : void visitWasmLoadGlobalVar(MWasmLoadGlobalVar* ins);
303 : void visitWasmStoreGlobalVar(MWasmStoreGlobalVar* ins);
304 : void visitWasmParameter(MWasmParameter* ins);
305 : void visitWasmReturn(MWasmReturn* ins);
306 : void visitWasmReturnVoid(MWasmReturnVoid* ins);
307 : void visitWasmStackArg(MWasmStackArg* ins);
308 : void visitWasmCall(MWasmCall* ins);
309 : void visitSetDOMProperty(MSetDOMProperty* ins);
310 : void visitGetDOMProperty(MGetDOMProperty* ins);
311 : void visitGetDOMMember(MGetDOMMember* ins);
312 : void visitRecompileCheck(MRecompileCheck* ins);
313 : void visitSimdBox(MSimdBox* ins);
314 : void visitSimdUnbox(MSimdUnbox* ins);
315 : void visitSimdUnaryArith(MSimdUnaryArith* ins);
316 : void visitSimdBinaryComp(MSimdBinaryComp* ins);
317 : void visitSimdBinaryBitwise(MSimdBinaryBitwise* ins);
318 : void visitSimdShift(MSimdShift* ins);
319 : void visitSimdConstant(MSimdConstant* ins);
320 : void visitSimdConvert(MSimdConvert* ins);
321 : void visitSimdReinterpretCast(MSimdReinterpretCast* ins);
322 : void visitSimdAllTrue(MSimdAllTrue* ins);
323 : void visitSimdAnyTrue(MSimdAnyTrue* ins);
324 : void visitPhi(MPhi* ins);
325 : void visitBeta(MBeta* ins);
326 : void visitObjectState(MObjectState* ins);
327 : void visitArrayState(MArrayState* ins);
328 : void visitUnknownValue(MUnknownValue* ins);
329 : void visitLexicalCheck(MLexicalCheck* ins);
330 : void visitThrowRuntimeLexicalError(MThrowRuntimeLexicalError* ins);
331 : void visitGlobalNameConflictsCheck(MGlobalNameConflictsCheck* ins);
332 : void visitDebugger(MDebugger* ins);
333 : void visitNewTarget(MNewTarget* ins);
334 : void visitArrowNewTarget(MArrowNewTarget* ins);
335 : void visitNaNToZero(MNaNToZero *ins);
336 : void visitAtomicIsLockFree(MAtomicIsLockFree* ins);
337 : void visitGuardSharedTypedArray(MGuardSharedTypedArray* ins);
338 : void visitCheckReturn(MCheckReturn* ins);
339 : void visitCheckIsObj(MCheckIsObj* ins);
340 : void visitCheckIsCallable(MCheckIsCallable* ins);
341 : void visitCheckObjCoercible(MCheckObjCoercible* ins);
342 : void visitDebugCheckSelfHosted(MDebugCheckSelfHosted* ins);
343 : void visitFinishBoundFunctionInit(MFinishBoundFunctionInit* ins);
344 : };
345 :
346 : } // namespace jit
347 : } // namespace js
348 :
349 : #endif /* jit_Lowering_h */
|