/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * vim: set ts=8 sts=4 et sw=4 tw=99: * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef jit_Lowering_h #define jit_Lowering_h // This file declares the structures that are used for attaching LIR to a // MIRGraph. #include "jit/LIR.h" #if defined(JS_CODEGEN_X86) # include "jit/x86/Lowering-x86.h" #elif defined(JS_CODEGEN_X64) # include "jit/x64/Lowering-x64.h" #elif defined(JS_CODEGEN_ARM) # include "jit/arm/Lowering-arm.h" #elif defined(JS_CODEGEN_ARM64) # include "jit/arm64/Lowering-arm64.h" #elif defined(JS_CODEGEN_MIPS32) # include "jit/mips32/Lowering-mips32.h" #elif defined(JS_CODEGEN_MIPS64) # include "jit/mips64/Lowering-mips64.h" #elif defined(JS_CODEGEN_NONE) # include "jit/none/Lowering-none.h" #else # error "Unknown architecture!" #endif namespace js { namespace jit { class LIRGenerator : public LIRGeneratorSpecific { void updateResumeState(MInstruction* ins); void updateResumeState(MBasicBlock* block); // The maximum depth, for framesizeclass determination. uint32_t maxargslots_; public: LIRGenerator(MIRGenerator* gen, MIRGraph& graph, LIRGraph& lirGraph) : LIRGeneratorSpecific(gen, graph, lirGraph), maxargslots_(0) { } MOZ_MUST_USE bool generate(); private: LBoxAllocation useBoxFixedAtStart(MDefinition* mir, Register reg1, Register reg2) { return useBoxFixed(mir, reg1, reg2, /* useAtStart = */ true); } LBoxAllocation useBoxFixedAtStart(MDefinition* mir, ValueOperand op); LBoxAllocation useBoxAtStart(MDefinition* mir, LUse::Policy policy = LUse::REGISTER); void lowerBitOp(JSOp op, MInstruction* ins); void lowerShiftOp(JSOp op, MShiftInstruction* ins); void lowerBinaryV(JSOp op, MBinaryInstruction* ins); void definePhis(); MOZ_MUST_USE bool lowerCallArguments(MCall* call); public: MOZ_MUST_USE bool visitInstruction(MInstruction* ins); MOZ_MUST_USE bool visitBlock(MBasicBlock* block); // Visitor hooks are explicit, to give CPU-specific versions a chance to // intercept without a bunch of explicit gunk in the .cpp. void visitCloneLiteral(MCloneLiteral* ins); void visitParameter(MParameter* param); void visitCallee(MCallee* callee); void visitIsConstructing(MIsConstructing* ins); void visitGoto(MGoto* ins); void visitTableSwitch(MTableSwitch* tableswitch); void visitNewArray(MNewArray* ins); void visitNewArrayCopyOnWrite(MNewArrayCopyOnWrite* ins); void visitNewArrayDynamicLength(MNewArrayDynamicLength* ins); void visitNewTypedArray(MNewTypedArray* ins); void visitNewTypedArrayDynamicLength(MNewTypedArrayDynamicLength* ins); void visitNewObject(MNewObject* ins); void visitNewTypedObject(MNewTypedObject* ins); void visitNewNamedLambdaObject(MNewNamedLambdaObject* ins); void visitNewCallObject(MNewCallObject* ins); void visitNewSingletonCallObject(MNewSingletonCallObject* ins); void visitNewStringObject(MNewStringObject* ins); void visitNewDerivedTypedObject(MNewDerivedTypedObject* ins); void visitInitElem(MInitElem* ins); void visitInitElemGetterSetter(MInitElemGetterSetter* ins); void visitMutateProto(MMutateProto* ins); void visitInitProp(MInitProp* ins); void visitInitPropGetterSetter(MInitPropGetterSetter* ins); void visitCheckOverRecursed(MCheckOverRecursed* ins); void visitDefVar(MDefVar* ins); void visitDefLexical(MDefLexical* ins); void visitDefFun(MDefFun* ins); void visitCreateThisWithTemplate(MCreateThisWithTemplate* ins); void visitCreateThisWithProto(MCreateThisWithProto* ins); void visitCreateThis(MCreateThis* ins); void visitCreateArgumentsObject(MCreateArgumentsObject* ins); void visitGetArgumentsObjectArg(MGetArgumentsObjectArg* ins); void visitSetArgumentsObjectArg(MSetArgumentsObjectArg* ins); void visitReturnFromCtor(MReturnFromCtor* ins); void visitComputeThis(MComputeThis* ins); void visitCall(MCall* call); void visitApplyArgs(MApplyArgs* apply); void visitApplyArray(MApplyArray* apply); void visitBail(MBail* bail); void visitUnreachable(MUnreachable* unreachable); void visitEncodeSnapshot(MEncodeSnapshot* ins); void visitAssertFloat32(MAssertFloat32* ins); void visitAssertRecoveredOnBailout(MAssertRecoveredOnBailout* ins); void visitGetDynamicName(MGetDynamicName* ins); void visitCallDirectEval(MCallDirectEval* ins); void visitTest(MTest* test); void visitGotoWithFake(MGotoWithFake* ins); void visitFunctionDispatch(MFunctionDispatch* ins); void visitObjectGroupDispatch(MObjectGroupDispatch* ins); void visitCompare(MCompare* comp); void visitTypeOf(MTypeOf* ins); void visitToAsync(MToAsync* ins); void visitToId(MToId* ins); void visitBitNot(MBitNot* ins); void visitBitAnd(MBitAnd* ins); void visitBitOr(MBitOr* ins); void visitBitXor(MBitXor* ins); void visitLsh(MLsh* ins); void visitRsh(MRsh* ins); void visitUrsh(MUrsh* ins); void visitSignExtend(MSignExtend* ins); void visitRotate(MRotate* ins); void visitFloor(MFloor* ins); void visitCeil(MCeil* ins); void visitRound(MRound* ins); void visitMinMax(MMinMax* ins); void visitAbs(MAbs* ins); void visitClz(MClz* ins); void visitCtz(MCtz* ins); void visitSqrt(MSqrt* ins); void visitPopcnt(MPopcnt* ins); void visitAtan2(MAtan2* ins); void visitHypot(MHypot* ins); void visitPow(MPow* ins); void visitMathFunction(MMathFunction* ins); void visitAdd(MAdd* ins); void visitSub(MSub* ins); void visitMul(MMul* ins); void visitDiv(MDiv* ins); void visitMod(MMod* ins); void visitConcat(MConcat* ins); void visitCharCodeAt(MCharCodeAt* ins); void visitFromCharCode(MFromCharCode* ins); void visitFromCodePoint(MFromCodePoint* ins); void visitSinCos(MSinCos *ins); void visitStringSplit(MStringSplit* ins); void visitStart(MStart* start); void visitOsrEntry(MOsrEntry* entry); void visitNop(MNop* nop); void visitLimitedTruncate(MLimitedTruncate* nop); void visitOsrValue(MOsrValue* value); void visitOsrEnvironmentChain(MOsrEnvironmentChain* object); void visitOsrReturnValue(MOsrReturnValue* value); void visitOsrArgumentsObject(MOsrArgumentsObject* object); void visitToDouble(MToDouble* convert); void visitToFloat32(MToFloat32* convert); void visitToInt32(MToInt32* convert); void visitTruncateToInt32(MTruncateToInt32* truncate); void visitWasmTruncateToInt32(MWasmTruncateToInt32* truncate); void visitWrapInt64ToInt32(MWrapInt64ToInt32* ins); void visitToString(MToString* convert); void visitToObjectOrNull(MToObjectOrNull* convert); void visitRegExp(MRegExp* ins); void visitRegExpMatcher(MRegExpMatcher* ins); void visitRegExpSearcher(MRegExpSearcher* ins); void visitRegExpTester(MRegExpTester* ins); void visitRegExpPrototypeOptimizable(MRegExpPrototypeOptimizable* ins); void visitRegExpInstanceOptimizable(MRegExpInstanceOptimizable* ins); void visitGetFirstDollarIndex(MGetFirstDollarIndex* ins); void visitStringReplace(MStringReplace* ins); void visitBinarySharedStub(MBinarySharedStub* ins); void visitUnarySharedStub(MUnarySharedStub* ins); void visitNullarySharedStub(MNullarySharedStub* ins); void visitLambda(MLambda* ins); void visitLambdaArrow(MLambdaArrow* ins); void visitSetFunName(MSetFunName* ins); void visitKeepAliveObject(MKeepAliveObject* ins); void visitSlots(MSlots* ins); void visitElements(MElements* ins); void visitConstantElements(MConstantElements* ins); void visitConvertElementsToDoubles(MConvertElementsToDoubles* ins); void visitMaybeToDoubleElement(MMaybeToDoubleElement* ins); void visitMaybeCopyElementsForWrite(MMaybeCopyElementsForWrite* ins); void visitLoadSlot(MLoadSlot* ins); void visitLoadFixedSlotAndUnbox(MLoadFixedSlotAndUnbox* ins); void visitFunctionEnvironment(MFunctionEnvironment* ins); void visitInterruptCheck(MInterruptCheck* ins); void visitWasmTrap(MWasmTrap* ins); void visitWasmReinterpret(MWasmReinterpret* ins); void visitStoreSlot(MStoreSlot* ins); void visitFilterTypeSet(MFilterTypeSet* ins); void visitTypeBarrier(MTypeBarrier* ins); void visitMonitorTypes(MMonitorTypes* ins); void visitPostWriteBarrier(MPostWriteBarrier* ins); void visitPostWriteElementBarrier(MPostWriteElementBarrier* ins); void visitArrayLength(MArrayLength* ins); void visitSetArrayLength(MSetArrayLength* ins); void visitGetNextEntryForIterator(MGetNextEntryForIterator* ins); void visitTypedArrayLength(MTypedArrayLength* ins); void visitTypedArrayElements(MTypedArrayElements* ins); void visitSetDisjointTypedElements(MSetDisjointTypedElements* ins); void visitTypedObjectElements(MTypedObjectElements* ins); void visitSetTypedObjectOffset(MSetTypedObjectOffset* ins); void visitTypedObjectDescr(MTypedObjectDescr* ins); void visitInitializedLength(MInitializedLength* ins); void visitSetInitializedLength(MSetInitializedLength* ins); void visitNot(MNot* ins); void visitBoundsCheck(MBoundsCheck* ins); void visitBoundsCheckLower(MBoundsCheckLower* ins); void visitLoadElement(MLoadElement* ins); void visitLoadElementHole(MLoadElementHole* ins); void visitLoadUnboxedObjectOrNull(MLoadUnboxedObjectOrNull* ins); void visitLoadUnboxedString(MLoadUnboxedString* ins); void visitStoreElement(MStoreElement* ins); void visitStoreElementHole(MStoreElementHole* ins); void visitFallibleStoreElement(MFallibleStoreElement* ins); void visitStoreUnboxedObjectOrNull(MStoreUnboxedObjectOrNull* ins); void visitStoreUnboxedString(MStoreUnboxedString* ins); void visitEffectiveAddress(MEffectiveAddress* ins); void visitArrayPopShift(MArrayPopShift* ins); void visitArrayPush(MArrayPush* ins); void visitArraySlice(MArraySlice* ins); void visitArrayJoin(MArrayJoin* ins); void visitLoadUnboxedScalar(MLoadUnboxedScalar* ins); void visitLoadTypedArrayElementHole(MLoadTypedArrayElementHole* ins); void visitLoadTypedArrayElementStatic(MLoadTypedArrayElementStatic* ins); void visitStoreUnboxedScalar(MStoreUnboxedScalar* ins); void visitStoreTypedArrayElementHole(MStoreTypedArrayElementHole* ins); void visitClampToUint8(MClampToUint8* ins); void visitLoadFixedSlot(MLoadFixedSlot* ins); void visitStoreFixedSlot(MStoreFixedSlot* ins); void visitGetPropertyCache(MGetPropertyCache* ins); void visitGetPropertyPolymorphic(MGetPropertyPolymorphic* ins); void visitSetPropertyPolymorphic(MSetPropertyPolymorphic* ins); void visitBindNameCache(MBindNameCache* ins); void visitCallBindVar(MCallBindVar* ins); void visitGuardObjectIdentity(MGuardObjectIdentity* ins); void visitGuardClass(MGuardClass* ins); void visitGuardObject(MGuardObject* ins); void visitGuardString(MGuardString* ins); void visitGuardReceiverPolymorphic(MGuardReceiverPolymorphic* ins); void visitPolyInlineGuard(MPolyInlineGuard* ins); void visitAssertRange(MAssertRange* ins); void visitCallGetProperty(MCallGetProperty* ins); void visitDeleteProperty(MDeleteProperty* ins); void visitDeleteElement(MDeleteElement* ins); void visitGetNameCache(MGetNameCache* ins); void visitCallGetIntrinsicValue(MCallGetIntrinsicValue* ins); void visitCallGetElement(MCallGetElement* ins); void visitCallSetElement(MCallSetElement* ins); void visitCallInitElementArray(MCallInitElementArray* ins); void visitSetPropertyCache(MSetPropertyCache* ins); void visitCallSetProperty(MCallSetProperty* ins); void visitIteratorStart(MIteratorStart* ins); void visitIteratorMore(MIteratorMore* ins); void visitIsNoIter(MIsNoIter* ins); void visitIteratorEnd(MIteratorEnd* ins); void visitStringLength(MStringLength* ins); void visitArgumentsLength(MArgumentsLength* ins); void visitGetFrameArgument(MGetFrameArgument* ins); void visitSetFrameArgument(MSetFrameArgument* ins); void visitRunOncePrologue(MRunOncePrologue* ins); void visitRest(MRest* ins); void visitThrow(MThrow* ins); void visitIn(MIn* ins); void visitInArray(MInArray* ins); void visitInstanceOf(MInstanceOf* ins); void visitCallInstanceOf(MCallInstanceOf* ins); void visitIsCallable(MIsCallable* ins); void visitIsConstructor(MIsConstructor* ins); void visitIsObject(MIsObject* ins); void visitHasClass(MHasClass* ins); void visitGuardToClass(MGuardToClass* ins); void visitWasmAddOffset(MWasmAddOffset* ins); void visitWasmBoundsCheck(MWasmBoundsCheck* ins); void visitWasmLoadGlobalVar(MWasmLoadGlobalVar* ins); void visitWasmStoreGlobalVar(MWasmStoreGlobalVar* ins); void visitWasmParameter(MWasmParameter* ins); void visitWasmReturn(MWasmReturn* ins); void visitWasmReturnVoid(MWasmReturnVoid* ins); void visitWasmStackArg(MWasmStackArg* ins); void visitWasmCall(MWasmCall* ins); void visitSetDOMProperty(MSetDOMProperty* ins); void visitGetDOMProperty(MGetDOMProperty* ins); void visitGetDOMMember(MGetDOMMember* ins); void visitRecompileCheck(MRecompileCheck* ins); void visitSimdBox(MSimdBox* ins); void visitSimdUnbox(MSimdUnbox* ins); void visitSimdUnaryArith(MSimdUnaryArith* ins); void visitSimdBinaryComp(MSimdBinaryComp* ins); void visitSimdBinaryBitwise(MSimdBinaryBitwise* ins); void visitSimdShift(MSimdShift* ins); void visitSimdConstant(MSimdConstant* ins); void visitSimdConvert(MSimdConvert* ins); void visitSimdReinterpretCast(MSimdReinterpretCast* ins); void visitSimdAllTrue(MSimdAllTrue* ins); void visitSimdAnyTrue(MSimdAnyTrue* ins); void visitPhi(MPhi* ins); void visitBeta(MBeta* ins); void visitObjectState(MObjectState* ins); void visitArrayState(MArrayState* ins); void visitUnknownValue(MUnknownValue* ins); void visitLexicalCheck(MLexicalCheck* ins); void visitThrowRuntimeLexicalError(MThrowRuntimeLexicalError* ins); void visitGlobalNameConflictsCheck(MGlobalNameConflictsCheck* ins); void visitDebugger(MDebugger* ins); void visitNewTarget(MNewTarget* ins); void visitArrowNewTarget(MArrowNewTarget* ins); void visitNaNToZero(MNaNToZero *ins); void visitAtomicIsLockFree(MAtomicIsLockFree* ins); void visitGuardSharedTypedArray(MGuardSharedTypedArray* ins); void visitCheckReturn(MCheckReturn* ins); void visitCheckIsObj(MCheckIsObj* ins); void visitCheckIsCallable(MCheckIsCallable* ins); void visitCheckObjCoercible(MCheckObjCoercible* ins); void visitDebugCheckSelfHosted(MDebugCheckSelfHosted* ins); }; } // namespace jit } // namespace js #endif /* jit_Lowering_h */