LCOV - code coverage report
Current view: top level - js/src/jit - Lowering.h (source / functions) Hit Total Coverage
Test: output.info Lines: 4 6 66.7 %
Date: 2017-07-14 16:53:18 Functions: 1 2 50.0 %
Legend: Lines: hit not hit

          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 */

Generated by: LCOV version 1.13