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