js/src/jit/Lowering.h

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/js/src/jit/Lowering.h	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,266 @@
     1.4 +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*-
     1.5 + * vim: set ts=8 sts=4 et sw=4 tw=99:
     1.6 + * This Source Code Form is subject to the terms of the Mozilla Public
     1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this
     1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     1.9 +
    1.10 +#ifndef jit_Lowering_h
    1.11 +#define jit_Lowering_h
    1.12 +
    1.13 +// This file declares the structures that are used for attaching LIR to a
    1.14 +// MIRGraph.
    1.15 +
    1.16 +#include "jit/LIR.h"
    1.17 +#if defined(JS_CODEGEN_X86)
    1.18 +# include "jit/x86/Lowering-x86.h"
    1.19 +#elif defined(JS_CODEGEN_X64)
    1.20 +# include "jit/x64/Lowering-x64.h"
    1.21 +#elif defined(JS_CODEGEN_ARM)
    1.22 +# include "jit/arm/Lowering-arm.h"
    1.23 +#elif defined(JS_CODEGEN_MIPS)
    1.24 +# include "jit/mips/Lowering-mips.h"
    1.25 +#else
    1.26 +# error "Unknown architecture!"
    1.27 +#endif
    1.28 +
    1.29 +namespace js {
    1.30 +namespace jit {
    1.31 +
    1.32 +class LIRGenerator : public LIRGeneratorSpecific
    1.33 +{
    1.34 +    void updateResumeState(MInstruction *ins);
    1.35 +    void updateResumeState(MBasicBlock *block);
    1.36 +
    1.37 +    // The maximum depth, for framesizeclass determination.
    1.38 +    uint32_t maxargslots_;
    1.39 +
    1.40 +  public:
    1.41 +    LIRGenerator(MIRGenerator *gen, MIRGraph &graph, LIRGraph &lirGraph)
    1.42 +      : LIRGeneratorSpecific(gen, graph, lirGraph),
    1.43 +        maxargslots_(0)
    1.44 +    { }
    1.45 +
    1.46 +    bool generate();
    1.47 +
    1.48 +  private:
    1.49 +
    1.50 +    bool useBoxAtStart(LInstruction *lir, size_t n, MDefinition *mir,
    1.51 +                       LUse::Policy policy = LUse::REGISTER) {
    1.52 +        return useBox(lir, n, mir, policy, true);
    1.53 +    }
    1.54 +
    1.55 +    bool lowerBitOp(JSOp op, MInstruction *ins);
    1.56 +    bool lowerShiftOp(JSOp op, MShiftInstruction *ins);
    1.57 +    bool lowerBinaryV(JSOp op, MBinaryInstruction *ins);
    1.58 +    bool precreatePhi(LBlock *block, MPhi *phi);
    1.59 +    bool definePhis();
    1.60 +
    1.61 +    bool lowerCallArguments(MCall *call);
    1.62 +
    1.63 +  public:
    1.64 +    bool visitInstruction(MInstruction *ins);
    1.65 +    bool visitBlock(MBasicBlock *block);
    1.66 +
    1.67 +    // Visitor hooks are explicit, to give CPU-specific versions a chance to
    1.68 +    // intercept without a bunch of explicit gunk in the .cpp.
    1.69 +    bool visitCloneLiteral(MCloneLiteral *ins);
    1.70 +    bool visitParameter(MParameter *param);
    1.71 +    bool visitCallee(MCallee *callee);
    1.72 +    bool visitGoto(MGoto *ins);
    1.73 +    bool visitTableSwitch(MTableSwitch *tableswitch);
    1.74 +    bool visitNewSlots(MNewSlots *ins);
    1.75 +    bool visitNewArray(MNewArray *ins);
    1.76 +    bool visitNewObject(MNewObject *ins);
    1.77 +    bool visitNewDeclEnvObject(MNewDeclEnvObject *ins);
    1.78 +    bool visitNewCallObject(MNewCallObject *ins);
    1.79 +    bool visitNewRunOnceCallObject(MNewRunOnceCallObject *ins);
    1.80 +    bool visitNewStringObject(MNewStringObject *ins);
    1.81 +    bool visitNewDerivedTypedObject(MNewDerivedTypedObject *ins);
    1.82 +    bool visitNewPar(MNewPar *ins);
    1.83 +    bool visitNewCallObjectPar(MNewCallObjectPar *ins);
    1.84 +    bool visitNewDenseArrayPar(MNewDenseArrayPar *ins);
    1.85 +    bool visitAbortPar(MAbortPar *ins);
    1.86 +    bool visitInitElem(MInitElem *ins);
    1.87 +    bool visitInitElemGetterSetter(MInitElemGetterSetter *ins);
    1.88 +    bool visitMutateProto(MMutateProto *ins);
    1.89 +    bool visitInitProp(MInitProp *ins);
    1.90 +    bool visitInitPropGetterSetter(MInitPropGetterSetter *ins);
    1.91 +    bool visitCheckOverRecursed(MCheckOverRecursed *ins);
    1.92 +    bool visitCheckOverRecursedPar(MCheckOverRecursedPar *ins);
    1.93 +    bool visitDefVar(MDefVar *ins);
    1.94 +    bool visitDefFun(MDefFun *ins);
    1.95 +    bool visitCreateThisWithTemplate(MCreateThisWithTemplate *ins);
    1.96 +    bool visitCreateThisWithProto(MCreateThisWithProto *ins);
    1.97 +    bool visitCreateThis(MCreateThis *ins);
    1.98 +    bool visitCreateArgumentsObject(MCreateArgumentsObject *ins);
    1.99 +    bool visitGetArgumentsObjectArg(MGetArgumentsObjectArg *ins);
   1.100 +    bool visitSetArgumentsObjectArg(MSetArgumentsObjectArg *ins);
   1.101 +    bool visitReturnFromCtor(MReturnFromCtor *ins);
   1.102 +    bool visitComputeThis(MComputeThis *ins);
   1.103 +    bool visitLoadArrowThis(MLoadArrowThis *ins);
   1.104 +    bool visitCall(MCall *call);
   1.105 +    bool visitApplyArgs(MApplyArgs *apply);
   1.106 +    bool visitArraySplice(MArraySplice *splice);
   1.107 +    bool visitBail(MBail *bail);
   1.108 +    bool visitAssertFloat32(MAssertFloat32 *ins);
   1.109 +    bool visitGetDynamicName(MGetDynamicName *ins);
   1.110 +    bool visitFilterArgumentsOrEval(MFilterArgumentsOrEval *ins);
   1.111 +    bool visitCallDirectEval(MCallDirectEval *ins);
   1.112 +    bool visitTest(MTest *test);
   1.113 +    bool visitFunctionDispatch(MFunctionDispatch *ins);
   1.114 +    bool visitTypeObjectDispatch(MTypeObjectDispatch *ins);
   1.115 +    bool visitCompare(MCompare *comp);
   1.116 +    bool visitTypeOf(MTypeOf *ins);
   1.117 +    bool visitToId(MToId *ins);
   1.118 +    bool visitBitNot(MBitNot *ins);
   1.119 +    bool visitBitAnd(MBitAnd *ins);
   1.120 +    bool visitBitOr(MBitOr *ins);
   1.121 +    bool visitBitXor(MBitXor *ins);
   1.122 +    bool visitLsh(MLsh *ins);
   1.123 +    bool visitRsh(MRsh *ins);
   1.124 +    bool visitUrsh(MUrsh *ins);
   1.125 +    bool visitFloor(MFloor *ins);
   1.126 +    bool visitRound(MRound *ins);
   1.127 +    bool visitMinMax(MMinMax *ins);
   1.128 +    bool visitAbs(MAbs *ins);
   1.129 +    bool visitSqrt(MSqrt *ins);
   1.130 +    bool visitAtan2(MAtan2 *ins);
   1.131 +    bool visitHypot(MHypot *ins);
   1.132 +    bool visitPow(MPow *ins);
   1.133 +    bool visitRandom(MRandom *ins);
   1.134 +    bool visitMathFunction(MMathFunction *ins);
   1.135 +    bool visitAdd(MAdd *ins);
   1.136 +    bool visitSub(MSub *ins);
   1.137 +    bool visitMul(MMul *ins);
   1.138 +    bool visitDiv(MDiv *ins);
   1.139 +    bool visitMod(MMod *ins);
   1.140 +    bool visitConcat(MConcat *ins);
   1.141 +    bool visitConcatPar(MConcatPar *ins);
   1.142 +    bool visitCharCodeAt(MCharCodeAt *ins);
   1.143 +    bool visitFromCharCode(MFromCharCode *ins);
   1.144 +    bool visitStringSplit(MStringSplit *ins);
   1.145 +    bool visitStart(MStart *start);
   1.146 +    bool visitOsrEntry(MOsrEntry *entry);
   1.147 +    bool visitNop(MNop *nop);
   1.148 +    bool visitOsrValue(MOsrValue *value);
   1.149 +    bool visitOsrScopeChain(MOsrScopeChain *object);
   1.150 +    bool visitOsrReturnValue(MOsrReturnValue *value);
   1.151 +    bool visitOsrArgumentsObject(MOsrArgumentsObject *object);
   1.152 +    bool visitToDouble(MToDouble *convert);
   1.153 +    bool visitToFloat32(MToFloat32 *convert);
   1.154 +    bool visitToInt32(MToInt32 *convert);
   1.155 +    bool visitTruncateToInt32(MTruncateToInt32 *truncate);
   1.156 +    bool visitToString(MToString *convert);
   1.157 +    bool visitRegExp(MRegExp *ins);
   1.158 +    bool visitRegExpExec(MRegExpExec *ins);
   1.159 +    bool visitRegExpTest(MRegExpTest *ins);
   1.160 +    bool visitRegExpReplace(MRegExpReplace *ins);
   1.161 +    bool visitStringReplace(MStringReplace *ins);
   1.162 +    bool visitLambda(MLambda *ins);
   1.163 +    bool visitLambdaArrow(MLambdaArrow *ins);
   1.164 +    bool visitLambdaPar(MLambdaPar *ins);
   1.165 +    bool visitImplicitThis(MImplicitThis *ins);
   1.166 +    bool visitSlots(MSlots *ins);
   1.167 +    bool visitElements(MElements *ins);
   1.168 +    bool visitConstantElements(MConstantElements *ins);
   1.169 +    bool visitConvertElementsToDoubles(MConvertElementsToDoubles *ins);
   1.170 +    bool visitMaybeToDoubleElement(MMaybeToDoubleElement *ins);
   1.171 +    bool visitLoadSlot(MLoadSlot *ins);
   1.172 +    bool visitFunctionEnvironment(MFunctionEnvironment *ins);
   1.173 +    bool visitForkJoinContext(MForkJoinContext *ins);
   1.174 +    bool visitGuardThreadExclusive(MGuardThreadExclusive *ins);
   1.175 +    bool visitInterruptCheck(MInterruptCheck *ins);
   1.176 +    bool visitInterruptCheckPar(MInterruptCheckPar *ins);
   1.177 +    bool visitStoreSlot(MStoreSlot *ins);
   1.178 +    bool visitFilterTypeSet(MFilterTypeSet *ins);
   1.179 +    bool visitTypeBarrier(MTypeBarrier *ins);
   1.180 +    bool visitMonitorTypes(MMonitorTypes *ins);
   1.181 +    bool visitPostWriteBarrier(MPostWriteBarrier *ins);
   1.182 +    bool visitArrayLength(MArrayLength *ins);
   1.183 +    bool visitSetArrayLength(MSetArrayLength *ins);
   1.184 +    bool visitTypedArrayLength(MTypedArrayLength *ins);
   1.185 +    bool visitTypedArrayElements(MTypedArrayElements *ins);
   1.186 +    bool visitNeuterCheck(MNeuterCheck *lir);
   1.187 +    bool visitTypedObjectElements(MTypedObjectElements *ins);
   1.188 +    bool visitSetTypedObjectOffset(MSetTypedObjectOffset *ins);
   1.189 +    bool visitInitializedLength(MInitializedLength *ins);
   1.190 +    bool visitSetInitializedLength(MSetInitializedLength *ins);
   1.191 +    bool visitNot(MNot *ins);
   1.192 +    bool visitBoundsCheck(MBoundsCheck *ins);
   1.193 +    bool visitBoundsCheckLower(MBoundsCheckLower *ins);
   1.194 +    bool visitLoadElement(MLoadElement *ins);
   1.195 +    bool visitLoadElementHole(MLoadElementHole *ins);
   1.196 +    bool visitStoreElement(MStoreElement *ins);
   1.197 +    bool visitStoreElementHole(MStoreElementHole *ins);
   1.198 +    bool visitEffectiveAddress(MEffectiveAddress *ins);
   1.199 +    bool visitArrayPopShift(MArrayPopShift *ins);
   1.200 +    bool visitArrayPush(MArrayPush *ins);
   1.201 +    bool visitArrayConcat(MArrayConcat *ins);
   1.202 +    bool visitLoadTypedArrayElement(MLoadTypedArrayElement *ins);
   1.203 +    bool visitLoadTypedArrayElementHole(MLoadTypedArrayElementHole *ins);
   1.204 +    bool visitLoadTypedArrayElementStatic(MLoadTypedArrayElementStatic *ins);
   1.205 +    bool visitStoreTypedArrayElement(MStoreTypedArrayElement *ins);
   1.206 +    bool visitStoreTypedArrayElementHole(MStoreTypedArrayElementHole *ins);
   1.207 +    bool visitClampToUint8(MClampToUint8 *ins);
   1.208 +    bool visitLoadFixedSlot(MLoadFixedSlot *ins);
   1.209 +    bool visitStoreFixedSlot(MStoreFixedSlot *ins);
   1.210 +    bool visitGetPropertyCache(MGetPropertyCache *ins);
   1.211 +    bool visitGetPropertyPolymorphic(MGetPropertyPolymorphic *ins);
   1.212 +    bool visitSetPropertyPolymorphic(MSetPropertyPolymorphic *ins);
   1.213 +    bool visitGetElementCache(MGetElementCache *ins);
   1.214 +    bool visitBindNameCache(MBindNameCache *ins);
   1.215 +    bool visitGuardObjectIdentity(MGuardObjectIdentity *ins);
   1.216 +    bool visitGuardClass(MGuardClass *ins);
   1.217 +    bool visitGuardObject(MGuardObject *ins);
   1.218 +    bool visitGuardString(MGuardString *ins);
   1.219 +    bool visitAssertRange(MAssertRange *ins);
   1.220 +    bool visitCallGetProperty(MCallGetProperty *ins);
   1.221 +    bool visitDeleteProperty(MDeleteProperty *ins);
   1.222 +    bool visitDeleteElement(MDeleteElement *ins);
   1.223 +    bool visitGetNameCache(MGetNameCache *ins);
   1.224 +    bool visitCallGetIntrinsicValue(MCallGetIntrinsicValue *ins);
   1.225 +    bool visitCallsiteCloneCache(MCallsiteCloneCache *ins);
   1.226 +    bool visitCallGetElement(MCallGetElement *ins);
   1.227 +    bool visitCallSetElement(MCallSetElement *ins);
   1.228 +    bool visitCallInitElementArray(MCallInitElementArray *ins);
   1.229 +    bool visitSetPropertyCache(MSetPropertyCache *ins);
   1.230 +    bool visitSetElementCache(MSetElementCache *ins);
   1.231 +    bool visitCallSetProperty(MCallSetProperty *ins);
   1.232 +    bool visitIteratorStart(MIteratorStart *ins);
   1.233 +    bool visitIteratorNext(MIteratorNext *ins);
   1.234 +    bool visitIteratorMore(MIteratorMore *ins);
   1.235 +    bool visitIteratorEnd(MIteratorEnd *ins);
   1.236 +    bool visitStringLength(MStringLength *ins);
   1.237 +    bool visitArgumentsLength(MArgumentsLength *ins);
   1.238 +    bool visitGetFrameArgument(MGetFrameArgument *ins);
   1.239 +    bool visitSetFrameArgument(MSetFrameArgument *ins);
   1.240 +    bool visitRunOncePrologue(MRunOncePrologue *ins);
   1.241 +    bool visitRest(MRest *ins);
   1.242 +    bool visitRestPar(MRestPar *ins);
   1.243 +    bool visitThrow(MThrow *ins);
   1.244 +    bool visitIn(MIn *ins);
   1.245 +    bool visitInArray(MInArray *ins);
   1.246 +    bool visitInstanceOf(MInstanceOf *ins);
   1.247 +    bool visitCallInstanceOf(MCallInstanceOf *ins);
   1.248 +    bool visitProfilerStackOp(MProfilerStackOp *ins);
   1.249 +    bool visitIsCallable(MIsCallable *ins);
   1.250 +    bool visitHaveSameClass(MHaveSameClass *ins);
   1.251 +    bool visitHasClass(MHasClass *ins);
   1.252 +    bool visitAsmJSLoadGlobalVar(MAsmJSLoadGlobalVar *ins);
   1.253 +    bool visitAsmJSStoreGlobalVar(MAsmJSStoreGlobalVar *ins);
   1.254 +    bool visitAsmJSLoadFFIFunc(MAsmJSLoadFFIFunc *ins);
   1.255 +    bool visitAsmJSParameter(MAsmJSParameter *ins);
   1.256 +    bool visitAsmJSReturn(MAsmJSReturn *ins);
   1.257 +    bool visitAsmJSVoidReturn(MAsmJSVoidReturn *ins);
   1.258 +    bool visitAsmJSPassStackArg(MAsmJSPassStackArg *ins);
   1.259 +    bool visitAsmJSCall(MAsmJSCall *ins);
   1.260 +    bool visitSetDOMProperty(MSetDOMProperty *ins);
   1.261 +    bool visitGetDOMProperty(MGetDOMProperty *ins);
   1.262 +    bool visitGetDOMMember(MGetDOMMember *ins);
   1.263 +    bool visitRecompileCheck(MRecompileCheck *ins);
   1.264 +};
   1.265 +
   1.266 +} // namespace jit
   1.267 +} // namespace js
   1.268 +
   1.269 +#endif /* jit_Lowering_h */

mercurial