#pragma once
#if ENABLE(DFG_JIT)
#include "DFGNodeFlags.h"
namespace JSC { namespace DFG {
#define FOR_EACH_DFG_OP(macro) \
\
macro(JSConstant, NodeResultJS) \
\
\
macro(DoubleConstant, NodeResultDouble) \
macro(Int52Constant, NodeResultInt52) \
\
\
macro(LazyJSConstant, NodeResultJS) \
\
\
\
\
macro(Identity, NodeResultJS) \
\
macro(IdentityWithProfile, NodeResultJS | NodeMustGenerate) \
\
\
macro(ToThis, NodeResultJS) \
macro(CreateThis, NodeResultJS) \
macro(GetCallee, NodeResultJS) \
macro(GetArgumentCountIncludingThis, NodeResultInt32) \
macro(SetArgumentCountIncludingThis, NodeMustGenerate) \
\
\
\
\
\
\
\
\
\
\
\
macro(GetLocal, NodeResultJS | NodeMustGenerate) \
macro(SetLocal, 0) \
\
macro(PutStack, NodeMustGenerate) \
macro(KillStack, NodeMustGenerate) \
macro(GetStack, NodeResultJS) \
\
macro(MovHint, NodeMustGenerate) \
macro(ZombieHint, NodeMustGenerate) \
macro(ExitOK, NodeMustGenerate) \
macro(Phantom, NodeMustGenerate) \
macro(Check, NodeMustGenerate) \
macro(CheckVarargs, NodeMustGenerate | NodeHasVarArgs) \
macro(Upsilon, 0) \
macro(Phi, 0) \
macro(Flush, NodeMustGenerate) \
macro(PhantomLocal, NodeMustGenerate) \
\
\
\
\
\
macro(LoopHint, NodeMustGenerate) \
\
\
\
macro(ExtractOSREntryLocal, NodeResultJS) \
macro(ExtractCatchLocal, NodeResultJS) \
\
\
macro(CheckTierUpInLoop, NodeMustGenerate) \
macro(CheckTierUpAndOSREnter, NodeMustGenerate) \
macro(CheckTierUpAtReturn, NodeMustGenerate) \
\
\
macro(SetArgument, 0) \
\
\
\
macro(InvalidationPoint, NodeMustGenerate) \
\
\
macro(BitAnd, NodeResultInt32) \
macro(BitOr, NodeResultInt32) \
macro(BitXor, NodeResultInt32) \
macro(BitLShift, NodeResultInt32) \
macro(BitRShift, NodeResultInt32) \
macro(BitURShift, NodeResultInt32) \
\
macro(ValueToInt32, NodeResultInt32) \
\
macro(UInt32ToNumber, NodeResultNumber) \
\
macro(BooleanToNumber, NodeResultJS) \
\
\
macro(DoubleAsInt32, NodeResultInt32) \
\
\
macro(DoubleRep, NodeResultDouble) \
macro(Int52Rep, NodeResultInt52) \
macro(ValueRep, NodeResultJS) \
\
\
macro(FiatInt52, NodeResultJS) \
\
\
\
\
\
\
\
\
macro(ArithAdd, NodeResultNumber | NodeMustGenerate) \
macro(ArithClz32, NodeResultInt32 | NodeMustGenerate) \
macro(ArithSub, NodeResultNumber | NodeMustGenerate) \
macro(ArithNegate, NodeResultNumber | NodeMustGenerate) \
macro(ArithMul, NodeResultNumber | NodeMustGenerate) \
macro(ArithIMul, NodeResultInt32) \
macro(ArithDiv, NodeResultNumber | NodeMustGenerate) \
macro(ArithMod, NodeResultNumber | NodeMustGenerate) \
macro(ArithAbs, NodeResultNumber | NodeMustGenerate) \
macro(ArithMin, NodeResultNumber) \
macro(ArithMax, NodeResultNumber) \
macro(ArithFRound, NodeResultDouble | NodeMustGenerate) \
macro(ArithPow, NodeResultDouble) \
macro(ArithRandom, NodeResultDouble | NodeMustGenerate) \
macro(ArithRound, NodeResultNumber | NodeMustGenerate) \
macro(ArithFloor, NodeResultNumber | NodeMustGenerate) \
macro(ArithCeil, NodeResultNumber | NodeMustGenerate) \
macro(ArithTrunc, NodeResultNumber | NodeMustGenerate) \
macro(ArithSqrt, NodeResultDouble | NodeMustGenerate) \
macro(ArithUnary, NodeResultDouble | NodeMustGenerate) \
\
\
macro(ValueAdd, NodeResultJS | NodeMustGenerate) \
\
\
macro(StrCat, NodeResultJS | NodeMustGenerate) \
\
\
\
\
\
\
macro(GetByVal, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(GetByValWithThis, NodeResultJS | NodeMustGenerate) \
macro(GetMyArgumentByVal, NodeResultJS | NodeMustGenerate) \
macro(GetMyArgumentByValOutOfBounds, NodeResultJS | NodeMustGenerate) \
macro(LoadVarargs, NodeMustGenerate) \
macro(ForwardVarargs, NodeMustGenerate) \
macro(PutByValDirect, NodeMustGenerate | NodeHasVarArgs) \
macro(PutByVal, NodeMustGenerate | NodeHasVarArgs) \
macro(PutByValAlias, NodeMustGenerate | NodeHasVarArgs) \
macro(TryGetById, NodeResultJS) \
macro(GetById, NodeResultJS | NodeMustGenerate) \
macro(GetByIdFlush, NodeResultJS | NodeMustGenerate) \
macro(GetByIdWithThis, NodeResultJS | NodeMustGenerate) \
macro(PutById, NodeMustGenerate) \
macro(PutByIdFlush, NodeMustGenerate) \
macro(PutByIdDirect, NodeMustGenerate) \
macro(PutByIdWithThis, NodeMustGenerate) \
macro(PutByValWithThis, NodeMustGenerate | NodeHasVarArgs) \
macro(PutGetterById, NodeMustGenerate) \
macro(PutSetterById, NodeMustGenerate) \
macro(PutGetterSetterById, NodeMustGenerate) \
macro(PutGetterByVal, NodeMustGenerate) \
macro(PutSetterByVal, NodeMustGenerate) \
macro(DefineDataProperty, NodeMustGenerate | NodeHasVarArgs) \
macro(DefineAccessorProperty, NodeMustGenerate | NodeHasVarArgs) \
macro(DeleteById, NodeResultBoolean | NodeMustGenerate) \
macro(DeleteByVal, NodeResultBoolean | NodeMustGenerate) \
macro(CheckStructure, NodeMustGenerate) \
macro(CheckStructureOrEmpty, NodeMustGenerate) \
macro(GetExecutable, NodeResultJS) \
macro(PutStructure, NodeMustGenerate) \
macro(AllocatePropertyStorage, NodeMustGenerate | NodeResultStorage) \
macro(ReallocatePropertyStorage, NodeMustGenerate | NodeResultStorage) \
macro(GetButterfly, NodeResultStorage) \
macro(NukeStructureAndSetButterfly, NodeMustGenerate) \
macro(CheckArray, NodeMustGenerate) \
macro(Arrayify, NodeMustGenerate) \
macro(ArrayifyToStructure, NodeMustGenerate) \
macro(GetIndexedPropertyStorage, NodeResultStorage) \
macro(ConstantStoragePointer, NodeResultStorage) \
macro(GetGetter, NodeResultJS) \
macro(GetSetter, NodeResultJS) \
macro(GetByOffset, NodeResultJS) \
macro(GetGetterSetterByOffset, NodeResultJS) \
macro(MultiGetByOffset, NodeResultJS | NodeMustGenerate) \
macro(PutByOffset, NodeMustGenerate) \
macro(MultiPutByOffset, NodeMustGenerate) \
macro(GetArrayLength, NodeResultInt32) \
macro(GetArrayMask, NodeResultInt32) \
macro(GetVectorLength, NodeResultInt32) \
macro(GetTypedArrayByteOffset, NodeResultInt32) \
macro(GetScope, NodeResultJS) \
macro(SkipScope, NodeResultJS) \
macro(ResolveScope, NodeResultJS | NodeMustGenerate) \
macro(ResolveScopeForHoistingFuncDeclInEval, NodeResultJS | NodeMustGenerate) \
macro(GetGlobalObject, NodeResultJS) \
macro(GetGlobalThis, NodeResultJS) \
macro(GetClosureVar, NodeResultJS) \
macro(PutClosureVar, NodeMustGenerate) \
macro(GetGlobalVar, NodeResultJS) \
macro(GetGlobalLexicalVariable, NodeResultJS) \
macro(PutGlobalVariable, NodeMustGenerate) \
macro(GetDynamicVar, NodeResultJS | NodeMustGenerate) \
macro(PutDynamicVar, NodeMustGenerate) \
macro(NotifyWrite, NodeMustGenerate) \
macro(GetRegExpObjectLastIndex, NodeResultJS) \
macro(SetRegExpObjectLastIndex, NodeMustGenerate) \
macro(RecordRegExpCachedResult, NodeMustGenerate | NodeHasVarArgs) \
macro(CheckCell, NodeMustGenerate) \
macro(CheckNotEmpty, NodeMustGenerate) \
macro(AssertNotEmpty, NodeMustGenerate) \
macro(CheckBadCell, NodeMustGenerate) \
macro(CheckInBounds, NodeMustGenerate) \
macro(CheckStringIdent, NodeMustGenerate) \
macro(CheckTypeInfoFlags, NodeMustGenerate) \
macro(CheckSubClass, NodeMustGenerate) \
macro(ParseInt, NodeMustGenerate | NodeResultJS) \
macro(GetPrototypeOf, NodeMustGenerate | NodeResultJS) \
\
\
macro(AtomicsAdd, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(AtomicsAnd, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(AtomicsCompareExchange, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(AtomicsExchange, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(AtomicsIsLockFree, NodeResultBoolean) \
macro(AtomicsLoad, NodeResultJS | NodeMustGenerate) \
macro(AtomicsOr, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(AtomicsStore, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(AtomicsSub, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(AtomicsXor, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
\
\
macro(ArrayPush, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(ArrayPop, NodeResultJS | NodeMustGenerate) \
macro(ArraySlice, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(ArrayIndexOf, NodeResultInt32 | NodeHasVarArgs) \
\
\
macro(RegExpExec, NodeResultJS | NodeMustGenerate) \
macro(RegExpTest, NodeResultJS | NodeMustGenerate) \
macro(StringReplace, NodeResultJS | NodeMustGenerate) \
macro(StringReplaceRegExp, NodeResultJS | NodeMustGenerate) \
\
\
macro(StringCharCodeAt, NodeResultInt32) \
macro(StringCharAt, NodeResultJS) \
macro(StringFromCharCode, NodeResultJS) \
\
\
macro(CompareLess, NodeResultBoolean | NodeMustGenerate) \
macro(CompareLessEq, NodeResultBoolean | NodeMustGenerate) \
macro(CompareGreater, NodeResultBoolean | NodeMustGenerate) \
macro(CompareGreaterEq, NodeResultBoolean | NodeMustGenerate) \
macro(CompareBelow, NodeResultBoolean) \
macro(CompareBelowEq, NodeResultBoolean) \
macro(CompareEq, NodeResultBoolean | NodeMustGenerate) \
macro(CompareStrictEq, NodeResultBoolean) \
macro(CompareEqPtr, NodeResultBoolean) \
\
\
macro(Call, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(DirectCall, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(Construct, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(DirectConstruct, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(CallVarargs, NodeResultJS | NodeMustGenerate) \
macro(CallForwardVarargs, NodeResultJS | NodeMustGenerate) \
macro(ConstructVarargs, NodeResultJS | NodeMustGenerate) \
macro(ConstructForwardVarargs, NodeResultJS | NodeMustGenerate) \
macro(TailCallInlinedCaller, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(DirectTailCallInlinedCaller, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(TailCallVarargsInlinedCaller, NodeResultJS | NodeMustGenerate) \
macro(TailCallForwardVarargsInlinedCaller, NodeResultJS | NodeMustGenerate) \
macro(CallEval, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
\
\
macro(LogShadowChickenPrologue, NodeMustGenerate) \
macro(LogShadowChickenTail, NodeMustGenerate) \
\
\
macro(NewObject, NodeResultJS) \
macro(NewArray, NodeResultJS | NodeHasVarArgs) \
macro(NewArrayWithSpread, NodeResultJS | NodeHasVarArgs) \
macro(NewArrayWithSize, NodeResultJS | NodeMustGenerate) \
macro(NewArrayBuffer, NodeResultJS) \
macro(NewTypedArray, NodeResultJS | NodeMustGenerate) \
macro(NewRegexp, NodeResultJS) \
\
macro(GetRestLength, NodeResultInt32) \
macro(CreateRest, NodeResultJS | NodeMustGenerate) \
\
macro(Spread, NodeResultJS | NodeMustGenerate) \
\
macro(PhantomNewObject, NodeResultJS | NodeMustGenerate) \
macro(PutHint, NodeMustGenerate) \
macro(CheckStructureImmediate, NodeMustGenerate) \
macro(MaterializeNewObject, NodeResultJS | NodeHasVarArgs) \
macro(PhantomNewFunction, NodeResultJS | NodeMustGenerate) \
macro(PhantomNewGeneratorFunction, NodeResultJS | NodeMustGenerate) \
macro(PhantomNewAsyncFunction, NodeResultJS | NodeMustGenerate) \
macro(PhantomNewAsyncGeneratorFunction, NodeResultJS | NodeMustGenerate) \
macro(PhantomCreateActivation, NodeResultJS | NodeMustGenerate) \
macro(MaterializeCreateActivation, NodeResultJS | NodeHasVarArgs) \
\
\
macro(OverridesHasInstance, NodeMustGenerate | NodeResultBoolean) \
macro(InstanceOf, NodeResultBoolean) \
macro(InstanceOfCustom, NodeMustGenerate | NodeResultBoolean) \
\
macro(IsCellWithType, NodeResultBoolean) \
macro(IsEmpty, NodeResultBoolean) \
macro(IsUndefined, NodeResultBoolean) \
macro(IsBoolean, NodeResultBoolean) \
macro(IsNumber, NodeResultBoolean) \
macro(IsObject, NodeResultBoolean) \
macro(IsObjectOrNull, NodeResultBoolean) \
macro(IsFunction, NodeResultBoolean) \
macro(IsTypedArrayView, NodeResultBoolean) \
macro(TypeOf, NodeResultJS) \
macro(LogicalNot, NodeResultBoolean) \
macro(ToPrimitive, NodeResultJS | NodeMustGenerate) \
macro(ToString, NodeResultJS | NodeMustGenerate) \
macro(ToNumber, NodeResultJS | NodeMustGenerate) \
macro(ToObject, NodeResultJS | NodeMustGenerate) \
macro(CallObjectConstructor, NodeResultJS) \
macro(CallStringConstructor, NodeResultJS | NodeMustGenerate) \
macro(NumberToStringWithRadix, NodeResultJS | NodeMustGenerate) \
macro(NumberToStringWithValidRadixConstant, NodeResultJS) \
macro(NewStringObject, NodeResultJS) \
macro(MakeRope, NodeResultJS) \
macro(In, NodeResultBoolean | NodeMustGenerate) \
macro(ProfileType, NodeMustGenerate) \
macro(ProfileControlFlow, NodeMustGenerate) \
macro(SetFunctionName, NodeMustGenerate) \
macro(HasOwnProperty, NodeResultBoolean) \
\
macro(CreateActivation, NodeResultJS) \
macro(PushWithScope, NodeResultJS | NodeMustGenerate) \
\
macro(CreateDirectArguments, NodeResultJS) \
macro(PhantomDirectArguments, NodeResultJS | NodeMustGenerate) \
macro(PhantomCreateRest, NodeResultJS | NodeMustGenerate) \
macro(PhantomSpread, NodeResultJS | NodeMustGenerate) \
macro(PhantomNewArrayWithSpread, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
macro(PhantomNewArrayBuffer, NodeResultJS | NodeMustGenerate) \
macro(CreateScopedArguments, NodeResultJS) \
macro(CreateClonedArguments, NodeResultJS) \
macro(PhantomClonedArguments, NodeResultJS | NodeMustGenerate) \
macro(GetFromArguments, NodeResultJS) \
macro(PutToArguments, NodeMustGenerate) \
macro(GetArgument, NodeResultJS) \
\
macro(NewFunction, NodeResultJS) \
\
macro(NewGeneratorFunction, NodeResultJS) \
\
macro(NewAsyncGeneratorFunction, NodeResultJS) \
\
macro(NewAsyncFunction, NodeResultJS) \
\
\
macro(Jump, NodeMustGenerate) \
macro(Branch, NodeMustGenerate) \
macro(Switch, NodeMustGenerate) \
macro(EntrySwitch, NodeMustGenerate) \
macro(Return, NodeMustGenerate) \
macro(TailCall, NodeMustGenerate | NodeHasVarArgs) \
macro(DirectTailCall, NodeMustGenerate | NodeHasVarArgs) \
macro(TailCallVarargs, NodeMustGenerate) \
macro(TailCallForwardVarargs, NodeMustGenerate) \
macro(Unreachable, NodeMustGenerate) \
macro(Throw, NodeMustGenerate) \
macro(ThrowStaticError, NodeMustGenerate) \
\
\
macro(CountExecution, NodeMustGenerate) \
\
macro(SuperSamplerBegin, NodeMustGenerate) \
macro(SuperSamplerEnd, NodeMustGenerate) \
\
\
\
\
macro(ForceOSRExit, NodeMustGenerate) \
\
\
\
\
macro(BottomValue, NodeResultJS) \
\
\
macro(CheckTraps, NodeMustGenerate) \
\
macro(StoreBarrier, NodeMustGenerate) \
macro(FencedStoreBarrier, NodeMustGenerate) \
\
\
macro(GetEnumerableLength, NodeMustGenerate | NodeResultJS) \
macro(HasIndexedProperty, NodeResultBoolean) \
macro(HasStructureProperty, NodeResultBoolean) \
macro(HasGenericProperty, NodeResultBoolean) \
macro(GetDirectPname, NodeMustGenerate | NodeHasVarArgs | NodeResultJS) \
macro(GetPropertyEnumerator, NodeMustGenerate | NodeResultJS) \
macro(GetEnumeratorStructurePname, NodeMustGenerate | NodeResultJS) \
macro(GetEnumeratorGenericPname, NodeMustGenerate | NodeResultJS) \
macro(ToIndexString, NodeResultJS) \
\
macro(MapHash, NodeResultInt32) \
macro(NormalizeMapKey, NodeResultJS) \
macro(GetMapBucket, NodeResultJS) \
macro(GetMapBucketHead, NodeResultJS) \
macro(GetMapBucketNext, NodeResultJS) \
macro(LoadKeyFromMapBucket, NodeResultJS) \
macro(LoadValueFromMapBucket, NodeResultJS) \
macro(SetAdd, NodeMustGenerate | NodeResultJS) \
macro(MapSet, NodeMustGenerate | NodeHasVarArgs | NodeResultJS) \
\
macro(WeakMapGet, NodeResultJS) \
macro(ExtractValueFromWeakMapGet, NodeResultJS) \
\
macro(StringSlice, NodeResultJS) \
macro(ToLowerCase, NodeResultJS) \
\
macro(CallDOMGetter, NodeResultJS | NodeMustGenerate) \
macro(CallDOM, NodeResultJS | NodeMustGenerate) \
\
\
\
macro(InitializeEntrypointArguments, NodeMustGenerate) \
\
\
macro(CPUIntrinsic, NodeResultJS | NodeMustGenerate) \
enum NodeType {
#define DFG_OP_ENUM(opcode, flags) opcode,
FOR_EACH_DFG_OP(DFG_OP_ENUM)
#undef DFG_OP_ENUM
LastNodeType
};
inline NodeFlags defaultFlags(NodeType op)
{
switch (op) {
#define DFG_OP_ENUM(opcode, flags) case opcode: return flags;
FOR_EACH_DFG_OP(DFG_OP_ENUM)
#undef DFG_OP_ENUM
default:
RELEASE_ASSERT_NOT_REACHED();
return 0;
}
}
inline bool isAtomicsIntrinsic(NodeType op)
{
switch (op) {
case AtomicsAdd:
case AtomicsAnd:
case AtomicsCompareExchange:
case AtomicsExchange:
case AtomicsLoad:
case AtomicsOr:
case AtomicsStore:
case AtomicsSub:
case AtomicsXor:
case AtomicsIsLockFree:
return true;
default:
return false;
}
}
static const unsigned maxNumExtraAtomicsArgs = 2;
inline unsigned numExtraAtomicsArgs(NodeType op)
{
switch (op) {
case AtomicsLoad:
return 0;
case AtomicsAdd:
case AtomicsAnd:
case AtomicsExchange:
case AtomicsOr:
case AtomicsStore:
case AtomicsSub:
case AtomicsXor:
return 1;
case AtomicsCompareExchange:
return 2;
default:
RELEASE_ASSERT_NOT_REACHED();
return 0;
}
}
} }
#endif // ENABLE(DFG_JIT)