michael@0: /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- michael@0: * vim: set ts=8 sts=4 et sw=4 tw=99: michael@0: * This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef jit_Lowering_h michael@0: #define jit_Lowering_h michael@0: michael@0: // This file declares the structures that are used for attaching LIR to a michael@0: // MIRGraph. michael@0: michael@0: #include "jit/LIR.h" michael@0: #if defined(JS_CODEGEN_X86) michael@0: # include "jit/x86/Lowering-x86.h" michael@0: #elif defined(JS_CODEGEN_X64) michael@0: # include "jit/x64/Lowering-x64.h" michael@0: #elif defined(JS_CODEGEN_ARM) michael@0: # include "jit/arm/Lowering-arm.h" michael@0: #elif defined(JS_CODEGEN_MIPS) michael@0: # include "jit/mips/Lowering-mips.h" michael@0: #else michael@0: # error "Unknown architecture!" michael@0: #endif michael@0: michael@0: namespace js { michael@0: namespace jit { michael@0: michael@0: class LIRGenerator : public LIRGeneratorSpecific michael@0: { michael@0: void updateResumeState(MInstruction *ins); michael@0: void updateResumeState(MBasicBlock *block); michael@0: michael@0: // The maximum depth, for framesizeclass determination. michael@0: uint32_t maxargslots_; michael@0: michael@0: public: michael@0: LIRGenerator(MIRGenerator *gen, MIRGraph &graph, LIRGraph &lirGraph) michael@0: : LIRGeneratorSpecific(gen, graph, lirGraph), michael@0: maxargslots_(0) michael@0: { } michael@0: michael@0: bool generate(); michael@0: michael@0: private: michael@0: michael@0: bool useBoxAtStart(LInstruction *lir, size_t n, MDefinition *mir, michael@0: LUse::Policy policy = LUse::REGISTER) { michael@0: return useBox(lir, n, mir, policy, true); michael@0: } michael@0: michael@0: bool lowerBitOp(JSOp op, MInstruction *ins); michael@0: bool lowerShiftOp(JSOp op, MShiftInstruction *ins); michael@0: bool lowerBinaryV(JSOp op, MBinaryInstruction *ins); michael@0: bool precreatePhi(LBlock *block, MPhi *phi); michael@0: bool definePhis(); michael@0: michael@0: bool lowerCallArguments(MCall *call); michael@0: michael@0: public: michael@0: bool visitInstruction(MInstruction *ins); michael@0: bool visitBlock(MBasicBlock *block); michael@0: michael@0: // Visitor hooks are explicit, to give CPU-specific versions a chance to michael@0: // intercept without a bunch of explicit gunk in the .cpp. michael@0: bool visitCloneLiteral(MCloneLiteral *ins); michael@0: bool visitParameter(MParameter *param); michael@0: bool visitCallee(MCallee *callee); michael@0: bool visitGoto(MGoto *ins); michael@0: bool visitTableSwitch(MTableSwitch *tableswitch); michael@0: bool visitNewSlots(MNewSlots *ins); michael@0: bool visitNewArray(MNewArray *ins); michael@0: bool visitNewObject(MNewObject *ins); michael@0: bool visitNewDeclEnvObject(MNewDeclEnvObject *ins); michael@0: bool visitNewCallObject(MNewCallObject *ins); michael@0: bool visitNewRunOnceCallObject(MNewRunOnceCallObject *ins); michael@0: bool visitNewStringObject(MNewStringObject *ins); michael@0: bool visitNewDerivedTypedObject(MNewDerivedTypedObject *ins); michael@0: bool visitNewPar(MNewPar *ins); michael@0: bool visitNewCallObjectPar(MNewCallObjectPar *ins); michael@0: bool visitNewDenseArrayPar(MNewDenseArrayPar *ins); michael@0: bool visitAbortPar(MAbortPar *ins); michael@0: bool visitInitElem(MInitElem *ins); michael@0: bool visitInitElemGetterSetter(MInitElemGetterSetter *ins); michael@0: bool visitMutateProto(MMutateProto *ins); michael@0: bool visitInitProp(MInitProp *ins); michael@0: bool visitInitPropGetterSetter(MInitPropGetterSetter *ins); michael@0: bool visitCheckOverRecursed(MCheckOverRecursed *ins); michael@0: bool visitCheckOverRecursedPar(MCheckOverRecursedPar *ins); michael@0: bool visitDefVar(MDefVar *ins); michael@0: bool visitDefFun(MDefFun *ins); michael@0: bool visitCreateThisWithTemplate(MCreateThisWithTemplate *ins); michael@0: bool visitCreateThisWithProto(MCreateThisWithProto *ins); michael@0: bool visitCreateThis(MCreateThis *ins); michael@0: bool visitCreateArgumentsObject(MCreateArgumentsObject *ins); michael@0: bool visitGetArgumentsObjectArg(MGetArgumentsObjectArg *ins); michael@0: bool visitSetArgumentsObjectArg(MSetArgumentsObjectArg *ins); michael@0: bool visitReturnFromCtor(MReturnFromCtor *ins); michael@0: bool visitComputeThis(MComputeThis *ins); michael@0: bool visitLoadArrowThis(MLoadArrowThis *ins); michael@0: bool visitCall(MCall *call); michael@0: bool visitApplyArgs(MApplyArgs *apply); michael@0: bool visitArraySplice(MArraySplice *splice); michael@0: bool visitBail(MBail *bail); michael@0: bool visitAssertFloat32(MAssertFloat32 *ins); michael@0: bool visitGetDynamicName(MGetDynamicName *ins); michael@0: bool visitFilterArgumentsOrEval(MFilterArgumentsOrEval *ins); michael@0: bool visitCallDirectEval(MCallDirectEval *ins); michael@0: bool visitTest(MTest *test); michael@0: bool visitFunctionDispatch(MFunctionDispatch *ins); michael@0: bool visitTypeObjectDispatch(MTypeObjectDispatch *ins); michael@0: bool visitCompare(MCompare *comp); michael@0: bool visitTypeOf(MTypeOf *ins); michael@0: bool visitToId(MToId *ins); michael@0: bool visitBitNot(MBitNot *ins); michael@0: bool visitBitAnd(MBitAnd *ins); michael@0: bool visitBitOr(MBitOr *ins); michael@0: bool visitBitXor(MBitXor *ins); michael@0: bool visitLsh(MLsh *ins); michael@0: bool visitRsh(MRsh *ins); michael@0: bool visitUrsh(MUrsh *ins); michael@0: bool visitFloor(MFloor *ins); michael@0: bool visitRound(MRound *ins); michael@0: bool visitMinMax(MMinMax *ins); michael@0: bool visitAbs(MAbs *ins); michael@0: bool visitSqrt(MSqrt *ins); michael@0: bool visitAtan2(MAtan2 *ins); michael@0: bool visitHypot(MHypot *ins); michael@0: bool visitPow(MPow *ins); michael@0: bool visitRandom(MRandom *ins); michael@0: bool visitMathFunction(MMathFunction *ins); michael@0: bool visitAdd(MAdd *ins); michael@0: bool visitSub(MSub *ins); michael@0: bool visitMul(MMul *ins); michael@0: bool visitDiv(MDiv *ins); michael@0: bool visitMod(MMod *ins); michael@0: bool visitConcat(MConcat *ins); michael@0: bool visitConcatPar(MConcatPar *ins); michael@0: bool visitCharCodeAt(MCharCodeAt *ins); michael@0: bool visitFromCharCode(MFromCharCode *ins); michael@0: bool visitStringSplit(MStringSplit *ins); michael@0: bool visitStart(MStart *start); michael@0: bool visitOsrEntry(MOsrEntry *entry); michael@0: bool visitNop(MNop *nop); michael@0: bool visitOsrValue(MOsrValue *value); michael@0: bool visitOsrScopeChain(MOsrScopeChain *object); michael@0: bool visitOsrReturnValue(MOsrReturnValue *value); michael@0: bool visitOsrArgumentsObject(MOsrArgumentsObject *object); michael@0: bool visitToDouble(MToDouble *convert); michael@0: bool visitToFloat32(MToFloat32 *convert); michael@0: bool visitToInt32(MToInt32 *convert); michael@0: bool visitTruncateToInt32(MTruncateToInt32 *truncate); michael@0: bool visitToString(MToString *convert); michael@0: bool visitRegExp(MRegExp *ins); michael@0: bool visitRegExpExec(MRegExpExec *ins); michael@0: bool visitRegExpTest(MRegExpTest *ins); michael@0: bool visitRegExpReplace(MRegExpReplace *ins); michael@0: bool visitStringReplace(MStringReplace *ins); michael@0: bool visitLambda(MLambda *ins); michael@0: bool visitLambdaArrow(MLambdaArrow *ins); michael@0: bool visitLambdaPar(MLambdaPar *ins); michael@0: bool visitImplicitThis(MImplicitThis *ins); michael@0: bool visitSlots(MSlots *ins); michael@0: bool visitElements(MElements *ins); michael@0: bool visitConstantElements(MConstantElements *ins); michael@0: bool visitConvertElementsToDoubles(MConvertElementsToDoubles *ins); michael@0: bool visitMaybeToDoubleElement(MMaybeToDoubleElement *ins); michael@0: bool visitLoadSlot(MLoadSlot *ins); michael@0: bool visitFunctionEnvironment(MFunctionEnvironment *ins); michael@0: bool visitForkJoinContext(MForkJoinContext *ins); michael@0: bool visitGuardThreadExclusive(MGuardThreadExclusive *ins); michael@0: bool visitInterruptCheck(MInterruptCheck *ins); michael@0: bool visitInterruptCheckPar(MInterruptCheckPar *ins); michael@0: bool visitStoreSlot(MStoreSlot *ins); michael@0: bool visitFilterTypeSet(MFilterTypeSet *ins); michael@0: bool visitTypeBarrier(MTypeBarrier *ins); michael@0: bool visitMonitorTypes(MMonitorTypes *ins); michael@0: bool visitPostWriteBarrier(MPostWriteBarrier *ins); michael@0: bool visitArrayLength(MArrayLength *ins); michael@0: bool visitSetArrayLength(MSetArrayLength *ins); michael@0: bool visitTypedArrayLength(MTypedArrayLength *ins); michael@0: bool visitTypedArrayElements(MTypedArrayElements *ins); michael@0: bool visitNeuterCheck(MNeuterCheck *lir); michael@0: bool visitTypedObjectElements(MTypedObjectElements *ins); michael@0: bool visitSetTypedObjectOffset(MSetTypedObjectOffset *ins); michael@0: bool visitInitializedLength(MInitializedLength *ins); michael@0: bool visitSetInitializedLength(MSetInitializedLength *ins); michael@0: bool visitNot(MNot *ins); michael@0: bool visitBoundsCheck(MBoundsCheck *ins); michael@0: bool visitBoundsCheckLower(MBoundsCheckLower *ins); michael@0: bool visitLoadElement(MLoadElement *ins); michael@0: bool visitLoadElementHole(MLoadElementHole *ins); michael@0: bool visitStoreElement(MStoreElement *ins); michael@0: bool visitStoreElementHole(MStoreElementHole *ins); michael@0: bool visitEffectiveAddress(MEffectiveAddress *ins); michael@0: bool visitArrayPopShift(MArrayPopShift *ins); michael@0: bool visitArrayPush(MArrayPush *ins); michael@0: bool visitArrayConcat(MArrayConcat *ins); michael@0: bool visitLoadTypedArrayElement(MLoadTypedArrayElement *ins); michael@0: bool visitLoadTypedArrayElementHole(MLoadTypedArrayElementHole *ins); michael@0: bool visitLoadTypedArrayElementStatic(MLoadTypedArrayElementStatic *ins); michael@0: bool visitStoreTypedArrayElement(MStoreTypedArrayElement *ins); michael@0: bool visitStoreTypedArrayElementHole(MStoreTypedArrayElementHole *ins); michael@0: bool visitClampToUint8(MClampToUint8 *ins); michael@0: bool visitLoadFixedSlot(MLoadFixedSlot *ins); michael@0: bool visitStoreFixedSlot(MStoreFixedSlot *ins); michael@0: bool visitGetPropertyCache(MGetPropertyCache *ins); michael@0: bool visitGetPropertyPolymorphic(MGetPropertyPolymorphic *ins); michael@0: bool visitSetPropertyPolymorphic(MSetPropertyPolymorphic *ins); michael@0: bool visitGetElementCache(MGetElementCache *ins); michael@0: bool visitBindNameCache(MBindNameCache *ins); michael@0: bool visitGuardObjectIdentity(MGuardObjectIdentity *ins); michael@0: bool visitGuardClass(MGuardClass *ins); michael@0: bool visitGuardObject(MGuardObject *ins); michael@0: bool visitGuardString(MGuardString *ins); michael@0: bool visitAssertRange(MAssertRange *ins); michael@0: bool visitCallGetProperty(MCallGetProperty *ins); michael@0: bool visitDeleteProperty(MDeleteProperty *ins); michael@0: bool visitDeleteElement(MDeleteElement *ins); michael@0: bool visitGetNameCache(MGetNameCache *ins); michael@0: bool visitCallGetIntrinsicValue(MCallGetIntrinsicValue *ins); michael@0: bool visitCallsiteCloneCache(MCallsiteCloneCache *ins); michael@0: bool visitCallGetElement(MCallGetElement *ins); michael@0: bool visitCallSetElement(MCallSetElement *ins); michael@0: bool visitCallInitElementArray(MCallInitElementArray *ins); michael@0: bool visitSetPropertyCache(MSetPropertyCache *ins); michael@0: bool visitSetElementCache(MSetElementCache *ins); michael@0: bool visitCallSetProperty(MCallSetProperty *ins); michael@0: bool visitIteratorStart(MIteratorStart *ins); michael@0: bool visitIteratorNext(MIteratorNext *ins); michael@0: bool visitIteratorMore(MIteratorMore *ins); michael@0: bool visitIteratorEnd(MIteratorEnd *ins); michael@0: bool visitStringLength(MStringLength *ins); michael@0: bool visitArgumentsLength(MArgumentsLength *ins); michael@0: bool visitGetFrameArgument(MGetFrameArgument *ins); michael@0: bool visitSetFrameArgument(MSetFrameArgument *ins); michael@0: bool visitRunOncePrologue(MRunOncePrologue *ins); michael@0: bool visitRest(MRest *ins); michael@0: bool visitRestPar(MRestPar *ins); michael@0: bool visitThrow(MThrow *ins); michael@0: bool visitIn(MIn *ins); michael@0: bool visitInArray(MInArray *ins); michael@0: bool visitInstanceOf(MInstanceOf *ins); michael@0: bool visitCallInstanceOf(MCallInstanceOf *ins); michael@0: bool visitProfilerStackOp(MProfilerStackOp *ins); michael@0: bool visitIsCallable(MIsCallable *ins); michael@0: bool visitHaveSameClass(MHaveSameClass *ins); michael@0: bool visitHasClass(MHasClass *ins); michael@0: bool visitAsmJSLoadGlobalVar(MAsmJSLoadGlobalVar *ins); michael@0: bool visitAsmJSStoreGlobalVar(MAsmJSStoreGlobalVar *ins); michael@0: bool visitAsmJSLoadFFIFunc(MAsmJSLoadFFIFunc *ins); michael@0: bool visitAsmJSParameter(MAsmJSParameter *ins); michael@0: bool visitAsmJSReturn(MAsmJSReturn *ins); michael@0: bool visitAsmJSVoidReturn(MAsmJSVoidReturn *ins); michael@0: bool visitAsmJSPassStackArg(MAsmJSPassStackArg *ins); michael@0: bool visitAsmJSCall(MAsmJSCall *ins); michael@0: bool visitSetDOMProperty(MSetDOMProperty *ins); michael@0: bool visitGetDOMProperty(MGetDOMProperty *ins); michael@0: bool visitGetDOMMember(MGetDOMMember *ins); michael@0: bool visitRecompileCheck(MRecompileCheck *ins); michael@0: }; michael@0: michael@0: } // namespace jit michael@0: } // namespace js michael@0: michael@0: #endif /* jit_Lowering_h */