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