summaryrefslogtreecommitdiffstats
path: root/js/src/jit/Lowering.h
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit/Lowering.h')
-rw-r--r--js/src/jit/Lowering.h338
1 files changed, 338 insertions, 0 deletions
diff --git a/js/src/jit/Lowering.h b/js/src/jit/Lowering.h
new file mode 100644
index 000000000..0f66a3c24
--- /dev/null
+++ b/js/src/jit/Lowering.h
@@ -0,0 +1,338 @@
+/* -*- 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 visitArraySplice(MArraySplice* splice);
+ 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 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 visitUnboxedArrayLength(MUnboxedArrayLength* ins);
+ void visitUnboxedArrayInitializedLength(MUnboxedArrayInitializedLength* ins);
+ void visitIncrementUnboxedArrayInitializedLength(MIncrementUnboxedArrayInitializedLength* ins);
+ void visitSetUnboxedArrayInitializedLength(MSetUnboxedArrayInitializedLength* 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 visitConvertUnboxedObjectToNative(MConvertUnboxedObjectToNative* 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 visitGuardUnboxedExpando(MGuardUnboxedExpando* ins);
+ void visitLoadUnboxedExpando(MLoadUnboxedExpando* 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 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 visitCheckObjCoercible(MCheckObjCoercible* ins);
+ void visitDebugCheckSelfHosted(MDebugCheckSelfHosted* ins);
+};
+
+} // namespace jit
+} // namespace js
+
+#endif /* jit_Lowering_h */