[BigInt] Add ValueBitLShift into DFG
[WebKit-https.git] / Source / JavaScriptCore / dfg / DFGNodeType.h
1 /*
2  * Copyright (C) 2012-2018 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #pragma once
27
28 #if ENABLE(DFG_JIT)
29
30 #include "DFGNodeFlags.h"
31
32 namespace JSC { namespace DFG {
33
34 // This macro defines a set of information about all known node types, used to populate NodeId, NodeType below.
35 #define FOR_EACH_DFG_OP(macro) \
36     /* A constant in the CodeBlock's constant pool. */\
37     macro(JSConstant, NodeResultJS) \
38     \
39     /* Constants with specific representations. */\
40     macro(DoubleConstant, NodeResultDouble) \
41     macro(Int52Constant, NodeResultInt52) \
42     \
43     /* Lazy JSValue constant. We don't know the JSValue bits of it yet. */\
44     macro(LazyJSConstant, NodeResultJS) \
45     \
46     /* Marker to indicate that an operation was optimized entirely and all that is left */\
47     /* is to make one node alias another. CSE will later usually eliminate this node, */\
48     /* though it may choose not to if it would corrupt predictions (very rare). */\
49     macro(Identity, NodeResultJS) \
50     /* Used for debugging to force a profile to appear as anything we want. */ \
51     macro(IdentityWithProfile, NodeResultJS | NodeMustGenerate) \
52     \
53     /* Nodes for handling functions (both as call and as construct). */\
54     macro(ToThis, NodeResultJS) \
55     macro(CreateThis, NodeResultJS) /* Note this is not MustGenerate since we're returning it anyway. */ \
56     macro(GetCallee, NodeResultJS) \
57     macro(SetCallee, NodeMustGenerate) \
58     macro(GetArgumentCountIncludingThis, NodeResultInt32) \
59     macro(SetArgumentCountIncludingThis, NodeMustGenerate) \
60     \
61     /* Nodes for local variable access. These nodes are linked together using Phi nodes. */\
62     /* Any two nodes that are part of the same Phi graph will share the same */\
63     /* VariableAccessData, and thus will share predictions. FIXME: We should come up with */\
64     /* better names for a lot of these. https://bugs.webkit.org/show_bug.cgi?id=137307. */\
65     /* Note that GetLocal is MustGenerate because it's our only way of knowing that some other */\
66     /* basic block might have read a local variable in bytecode. We only remove GetLocals if it */\
67     /* is redundant because of an earlier GetLocal or SetLocal in the same block. We could make */\
68     /* these not MustGenerate and use a more sophisticated analysis to insert PhantomLocals in */\
69     /* the same way that we insert Phantoms. That's hard and probably not profitable. See */\
70     /* https://bugs.webkit.org/show_bug.cgi?id=144086 */\
71     macro(GetLocal, NodeResultJS | NodeMustGenerate) \
72     macro(SetLocal, 0) \
73     \
74     macro(PutStack, NodeMustGenerate) \
75     macro(KillStack, NodeMustGenerate) \
76     macro(GetStack, NodeResultJS) \
77     \
78     macro(MovHint, NodeMustGenerate) \
79     macro(ZombieHint, NodeMustGenerate) \
80     macro(ExitOK, NodeMustGenerate) /* Indicates that exit state is intact. */ \
81     macro(Phantom, NodeMustGenerate) \
82     macro(Check, NodeMustGenerate) /* Used if we want just a type check but not liveness. Non-checking uses will be removed. */\
83     macro(CheckVarargs, NodeMustGenerate | NodeHasVarArgs) /* Used if we want just a type check but not liveness. Non-checking uses will be removed. */\
84     macro(Upsilon, 0) \
85     macro(Phi, 0) \
86     macro(Flush, NodeMustGenerate) \
87     macro(PhantomLocal, NodeMustGenerate) \
88     \
89     /* Hint that this is where bytecode thinks is a good place to OSR. Note that this */\
90     /* will exist even in inlined loops. This has no execution semantics but it must */\
91     /* survive all DCE. We treat this as being a can-exit because tier-up to FTL may */\
92     /* want all state. */\
93     macro(LoopHint, NodeMustGenerate) \
94     \
95     /* Special node for OSR entry into the FTL. Indicates that we're loading a local */\
96     /* variable from the scratch buffer. */\
97     macro(ExtractOSREntryLocal, NodeResultJS) \
98     macro(ExtractCatchLocal, NodeResultJS) \
99     macro(ClearCatchLocals, NodeMustGenerate) \
100     \
101     /* Tier-up checks from the DFG to the FTL. */\
102     macro(CheckTierUpInLoop, NodeMustGenerate) \
103     macro(CheckTierUpAndOSREnter, NodeMustGenerate) \
104     macro(CheckTierUpAtReturn, NodeMustGenerate) \
105     \
106     /* Marker for an argument being set at the prologue of a function. The argument is guaranteed to be set after this node. */\
107     macro(SetArgumentDefinitely, 0) \
108     /* A marker like the above that we use to track variable liveness and OSR exit state. However, it's not guaranteed to be set. To verify it was set, you'd need to check the actual argument length. We use this for varargs when we're unsure how many argument may actually end up on the stack. */\
109     macro(SetArgumentMaybe, 0) \
110     \
111     /* Marker of location in the IR where we may possibly perform jump replacement to */\
112     /* invalidate this code block. */\
113     macro(InvalidationPoint, NodeMustGenerate) \
114     \
115     /* Nodes for bitwise operations. */\
116     macro(ValueBitNot, NodeResultJS | NodeMustGenerate) \
117     macro(ArithBitNot, NodeResultInt32) \
118     macro(ValueBitAnd, NodeResultJS | NodeMustGenerate) \
119     macro(ArithBitAnd, NodeResultInt32) \
120     macro(ValueBitOr, NodeResultJS | NodeMustGenerate) \
121     macro(ArithBitOr, NodeResultInt32) \
122     macro(ValueBitXor, NodeResultJS | NodeMustGenerate) \
123     macro(ArithBitXor, NodeResultInt32) \
124     macro(ArithBitLShift, NodeResultInt32) \
125     macro(ValueBitLShift, NodeResultJS | NodeMustGenerate) \
126     macro(BitRShift, NodeResultInt32) \
127     macro(BitURShift, NodeResultInt32) \
128     /* Bitwise operators call ToInt32 on their operands. */\
129     macro(ValueToInt32, NodeResultInt32) \
130     /* Used to box the result of URShift nodes (result has range 0..2^32-1). */\
131     macro(UInt32ToNumber, NodeResultNumber) \
132     /* Converts booleans to numbers but passes everything else through. */\
133     macro(BooleanToNumber, NodeResultJS) \
134     \
135     /* Attempt to truncate a double to int32; this will exit if it can't do it. */\
136     macro(DoubleAsInt32, NodeResultInt32) \
137     \
138     /* Change the representation of a value. */\
139     macro(DoubleRep, NodeResultDouble) \
140     macro(Int52Rep, NodeResultInt52) \
141     macro(ValueRep, NodeResultJS) \
142     \
143     /* Bogus type asserting node. Useful for testing, disappears during Fixup. */\
144     macro(FiatInt52, NodeResultJS) \
145     \
146     /* Nodes for arithmetic operations. Note that if they do checks other than just type checks, */\
147     /* then they are MustGenerate. This is probably stricter than it needs to be - for example */\
148     /* they won't do checks if they are speculated double. Also, we could kill these if we do it */\
149     /* before AI starts eliminating downstream operations based on proofs, for example in the */\
150     /* case of "var tmp = a + b; return (tmp | 0) == tmp;". If a, b are speculated integer then */\
151     /* this is only true if we do the overflow check - hence the need to keep it alive. More */\
152     /* generally, we need to keep alive any operation whose checks cause filtration in AI. */\
153     macro(ArithAdd, NodeResultNumber | NodeMustGenerate) \
154     macro(ArithClz32, NodeResultInt32 | NodeMustGenerate) \
155     macro(ArithSub, NodeResultNumber | NodeMustGenerate) \
156     macro(ArithNegate, NodeResultNumber | NodeMustGenerate) \
157     macro(ArithMul, NodeResultNumber | NodeMustGenerate) \
158     macro(ArithIMul, NodeResultInt32) \
159     macro(ArithDiv, NodeResultNumber | NodeMustGenerate) \
160     macro(ArithMod, NodeResultNumber | NodeMustGenerate) \
161     macro(ArithAbs, NodeResultNumber | NodeMustGenerate) \
162     macro(ArithMin, NodeResultNumber) \
163     macro(ArithMax, NodeResultNumber) \
164     macro(ArithFRound, NodeResultDouble | NodeMustGenerate) \
165     macro(ArithPow, NodeResultDouble) \
166     macro(ArithRandom, NodeResultDouble | NodeMustGenerate) \
167     macro(ArithRound, NodeResultNumber | NodeMustGenerate) \
168     macro(ArithFloor, NodeResultNumber | NodeMustGenerate) \
169     macro(ArithCeil, NodeResultNumber | NodeMustGenerate) \
170     macro(ArithTrunc, NodeResultNumber | NodeMustGenerate) \
171     macro(ArithSqrt, NodeResultDouble | NodeMustGenerate) \
172     macro(ArithUnary, NodeResultDouble | NodeMustGenerate) \
173     \
174     /* BigInt is a valid operand for negate operations */\
175     macro(ValueNegate, NodeResultJS | NodeMustGenerate) \
176     \
177     /* Add of values may either be arithmetic, or result in string concatenation. */\
178     macro(ValueAdd, NodeResultJS | NodeMustGenerate) \
179     \
180     macro(ValueSub, NodeResultJS | NodeMustGenerate) \
181     macro(ValueMul, NodeResultJS | NodeMustGenerate) \
182     macro(ValueDiv, NodeResultJS | NodeMustGenerate) \
183     macro(ValuePow, NodeResultJS | NodeMustGenerate) \
184     macro(ValueMod, NodeResultJS | NodeMustGenerate) \
185     \
186     /* Add of values that always convers its inputs to strings. May have two or three kids. */\
187     macro(StrCat, NodeResultJS | NodeMustGenerate) \
188     \
189     /* Property access. */\
190     /* PutByValAlias indicates a 'put' aliases a prior write to the same property. */\
191     /* Since a put to 'length' may invalidate optimizations here, */\
192     /* this must be the directly subsequent property put. Note that PutByVal */\
193     /* opcodes use VarArgs beause they may have up to 4 children. */\
194     macro(GetByVal, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
195     macro(GetByValWithThis, NodeResultJS | NodeMustGenerate) \
196     macro(GetMyArgumentByVal, NodeResultJS | NodeMustGenerate) \
197     macro(GetMyArgumentByValOutOfBounds, NodeResultJS | NodeMustGenerate) \
198     macro(LoadVarargs, NodeMustGenerate) \
199     macro(ForwardVarargs, NodeMustGenerate) \
200     macro(PutByValDirect, NodeMustGenerate | NodeHasVarArgs) \
201     macro(PutByVal, NodeMustGenerate | NodeHasVarArgs) \
202     macro(PutByValAlias, NodeMustGenerate | NodeHasVarArgs) \
203     macro(TryGetById, NodeResultJS) \
204     macro(GetById, NodeResultJS | NodeMustGenerate) \
205     macro(GetByIdFlush, NodeResultJS | NodeMustGenerate) \
206     macro(GetByIdWithThis, NodeResultJS | NodeMustGenerate) \
207     macro(GetByIdDirect, NodeResultJS | NodeMustGenerate) \
208     macro(GetByIdDirectFlush, NodeResultJS | NodeMustGenerate) \
209     macro(PutById, NodeMustGenerate) \
210     macro(PutByIdFlush, NodeMustGenerate) \
211     macro(PutByIdDirect, NodeMustGenerate) \
212     macro(PutByIdWithThis, NodeMustGenerate) \
213     macro(PutByValWithThis, NodeMustGenerate | NodeHasVarArgs) \
214     macro(PutGetterById, NodeMustGenerate) \
215     macro(PutSetterById, NodeMustGenerate) \
216     macro(PutGetterSetterById, NodeMustGenerate) \
217     macro(PutGetterByVal, NodeMustGenerate) \
218     macro(PutSetterByVal, NodeMustGenerate) \
219     macro(DefineDataProperty, NodeMustGenerate | NodeHasVarArgs) \
220     macro(DefineAccessorProperty, NodeMustGenerate | NodeHasVarArgs) \
221     macro(DeleteById, NodeResultBoolean | NodeMustGenerate) \
222     macro(DeleteByVal, NodeResultBoolean | NodeMustGenerate) \
223     macro(CheckStructure, NodeMustGenerate) \
224     macro(CheckStructureOrEmpty, NodeMustGenerate) \
225     macro(GetExecutable, NodeResultJS) \
226     macro(PutStructure, NodeMustGenerate) \
227     macro(AllocatePropertyStorage, NodeMustGenerate | NodeResultStorage) \
228     macro(ReallocatePropertyStorage, NodeMustGenerate | NodeResultStorage) \
229     macro(GetButterfly, NodeResultStorage) \
230     macro(NukeStructureAndSetButterfly, NodeMustGenerate) \
231     macro(CheckArray, NodeMustGenerate) \
232     macro(Arrayify, NodeMustGenerate) \
233     macro(ArrayifyToStructure, NodeMustGenerate) \
234     macro(GetIndexedPropertyStorage, NodeResultStorage) \
235     macro(ConstantStoragePointer, NodeResultStorage) \
236     macro(GetGetter, NodeResultJS) \
237     macro(GetSetter, NodeResultJS) \
238     macro(GetByOffset, NodeResultJS) \
239     macro(GetGetterSetterByOffset, NodeResultJS) \
240     macro(MultiGetByOffset, NodeResultJS | NodeMustGenerate) \
241     macro(PutByOffset, NodeMustGenerate) \
242     macro(MultiPutByOffset, NodeMustGenerate) \
243     macro(GetArrayLength, NodeResultInt32) \
244     macro(GetVectorLength, NodeResultInt32) \
245     macro(GetTypedArrayByteOffset, NodeResultInt32) \
246     macro(GetScope, NodeResultJS) \
247     macro(SkipScope, NodeResultJS) \
248     macro(ResolveScope, NodeResultJS | NodeMustGenerate) \
249     macro(ResolveScopeForHoistingFuncDeclInEval, NodeResultJS | NodeMustGenerate) \
250     macro(GetGlobalObject, NodeResultJS) \
251     macro(GetGlobalThis, NodeResultJS) \
252     macro(GetClosureVar, NodeResultJS) \
253     macro(PutClosureVar, NodeMustGenerate) \
254     macro(GetGlobalVar, NodeResultJS) \
255     macro(GetGlobalLexicalVariable, NodeResultJS) \
256     macro(PutGlobalVariable, NodeMustGenerate) \
257     macro(GetDynamicVar, NodeResultJS | NodeMustGenerate) \
258     macro(PutDynamicVar, NodeMustGenerate) \
259     macro(NotifyWrite, NodeMustGenerate) \
260     macro(GetRegExpObjectLastIndex, NodeResultJS) \
261     macro(SetRegExpObjectLastIndex, NodeMustGenerate) \
262     macro(RecordRegExpCachedResult, NodeMustGenerate | NodeHasVarArgs) \
263     macro(CheckCell, NodeMustGenerate) \
264     macro(CheckNotEmpty, NodeMustGenerate) \
265     macro(AssertNotEmpty, NodeMustGenerate) \
266     macro(CheckBadCell, NodeMustGenerate) \
267     macro(CheckInBounds, NodeMustGenerate | NodeResultJS) \
268     macro(CheckStringIdent, NodeMustGenerate) \
269     macro(CheckTypeInfoFlags, NodeMustGenerate) /* Takes an OpInfo with the flags you want to test are set */\
270     macro(CheckSubClass, NodeMustGenerate) \
271     macro(ParseInt, NodeMustGenerate | NodeResultJS) \
272     macro(GetPrototypeOf, NodeMustGenerate | NodeResultJS) \
273     macro(ObjectCreate, NodeMustGenerate | NodeResultJS) \
274     macro(ObjectKeys, NodeMustGenerate | NodeResultJS) \
275     \
276     /* Atomics object functions. */\
277     macro(AtomicsAdd, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
278     macro(AtomicsAnd, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
279     macro(AtomicsCompareExchange, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
280     macro(AtomicsExchange, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
281     macro(AtomicsIsLockFree, NodeResultBoolean) \
282     macro(AtomicsLoad, NodeResultJS | NodeMustGenerate) \
283     macro(AtomicsOr, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
284     macro(AtomicsStore, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
285     macro(AtomicsSub, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
286     macro(AtomicsXor, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
287     \
288     /* Optimizations for array mutation. */\
289     macro(ArrayPush, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
290     macro(ArrayPop, NodeResultJS | NodeMustGenerate) \
291     macro(ArraySlice, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
292     macro(ArrayIndexOf, NodeResultInt32 | NodeHasVarArgs) \
293     \
294     /* Optimizations for regular expression matching. */\
295     macro(RegExpExec, NodeResultJS | NodeMustGenerate) \
296     macro(RegExpExecNonGlobalOrSticky, NodeResultJS) \
297     macro(RegExpTest, NodeResultJS | NodeMustGenerate) \
298     macro(RegExpMatchFast, NodeResultJS | NodeMustGenerate) \
299     macro(RegExpMatchFastGlobal, NodeResultJS) \
300     macro(StringReplace, NodeResultJS | NodeMustGenerate) \
301     macro(StringReplaceRegExp, NodeResultJS | NodeMustGenerate) \
302     \
303     /* Optimizations for string access */ \
304     macro(StringCharCodeAt, NodeResultInt32) \
305     macro(StringCharAt, NodeResultJS) \
306     macro(StringFromCharCode, NodeResultJS | NodeMustGenerate) \
307     \
308     /* Nodes for comparison operations. */\
309     macro(CompareLess, NodeResultBoolean | NodeMustGenerate) \
310     macro(CompareLessEq, NodeResultBoolean | NodeMustGenerate) \
311     macro(CompareGreater, NodeResultBoolean | NodeMustGenerate) \
312     macro(CompareGreaterEq, NodeResultBoolean | NodeMustGenerate) \
313     macro(CompareBelow, NodeResultBoolean) \
314     macro(CompareBelowEq, NodeResultBoolean) \
315     macro(CompareEq, NodeResultBoolean | NodeMustGenerate) \
316     macro(CompareStrictEq, NodeResultBoolean) \
317     macro(CompareEqPtr, NodeResultBoolean) \
318     macro(SameValue, NodeResultBoolean) \
319     \
320     /* Calls. */\
321     macro(Call, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
322     macro(DirectCall, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
323     macro(Construct, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
324     macro(DirectConstruct, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
325     macro(CallVarargs, NodeResultJS | NodeMustGenerate) \
326     macro(CallForwardVarargs, NodeResultJS | NodeMustGenerate) \
327     macro(ConstructVarargs, NodeResultJS | NodeMustGenerate) \
328     macro(ConstructForwardVarargs, NodeResultJS | NodeMustGenerate) \
329     macro(TailCallInlinedCaller, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
330     macro(DirectTailCallInlinedCaller, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
331     macro(TailCallVarargsInlinedCaller, NodeResultJS | NodeMustGenerate) \
332     macro(TailCallForwardVarargsInlinedCaller, NodeResultJS | NodeMustGenerate) \
333     macro(CallEval, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
334     \
335     /* Shadow Chicken */\
336     macro(LogShadowChickenPrologue, NodeMustGenerate) \
337     macro(LogShadowChickenTail, NodeMustGenerate) \
338     \
339     /* Allocations. */\
340     macro(NewObject, NodeResultJS) \
341     macro(NewArray, NodeResultJS | NodeHasVarArgs) \
342     macro(NewArrayWithSpread, NodeResultJS | NodeHasVarArgs) \
343     macro(NewArrayWithSize, NodeResultJS | NodeMustGenerate) \
344     macro(NewArrayBuffer, NodeResultJS) \
345     macro(NewTypedArray, NodeResultJS | NodeMustGenerate) \
346     macro(NewRegexp, NodeResultJS) \
347     macro(NewSymbol, NodeResultJS) \
348     macro(NewStringObject, NodeResultJS) \
349     /* Rest Parameter */\
350     macro(GetRestLength, NodeResultInt32) \
351     macro(CreateRest, NodeResultJS | NodeMustGenerate) \
352     \
353     macro(Spread, NodeResultJS | NodeMustGenerate) \
354     /* Support for allocation sinking. */\
355     macro(PhantomNewObject, NodeResultJS | NodeMustGenerate) \
356     macro(PutHint, NodeMustGenerate) \
357     macro(CheckStructureImmediate, NodeMustGenerate) \
358     macro(MaterializeNewObject, NodeResultJS | NodeHasVarArgs) \
359     macro(PhantomNewFunction, NodeResultJS | NodeMustGenerate) \
360     macro(PhantomNewGeneratorFunction, NodeResultJS | NodeMustGenerate) \
361     macro(PhantomNewAsyncFunction, NodeResultJS | NodeMustGenerate) \
362     macro(PhantomNewAsyncGeneratorFunction, NodeResultJS | NodeMustGenerate) \
363     macro(PhantomCreateActivation, NodeResultJS | NodeMustGenerate) \
364     macro(MaterializeCreateActivation, NodeResultJS | NodeHasVarArgs) \
365     macro(PhantomNewRegexp, NodeResultJS | NodeMustGenerate) \
366     \
367     /* Nodes for misc operations. */\
368     macro(OverridesHasInstance, NodeMustGenerate | NodeResultBoolean) \
369     macro(InstanceOf, NodeMustGenerate | NodeResultBoolean) \
370     macro(InstanceOfCustom, NodeMustGenerate | NodeResultBoolean) \
371     macro(MatchStructure, NodeMustGenerate | NodeResultBoolean) \
372     \
373     macro(IsCellWithType, NodeResultBoolean) \
374     macro(IsEmpty, NodeResultBoolean) \
375     macro(IsUndefined, NodeResultBoolean) \
376     macro(IsUndefinedOrNull, NodeResultBoolean) \
377     macro(IsBoolean, NodeResultBoolean) \
378     macro(IsNumber, NodeResultBoolean) \
379     macro(NumberIsInteger, NodeResultBoolean) \
380     macro(IsObject, NodeResultBoolean) \
381     macro(IsObjectOrNull, NodeResultBoolean) \
382     macro(IsFunction, NodeResultBoolean) \
383     macro(IsTypedArrayView, NodeResultBoolean) \
384     macro(TypeOf, NodeResultJS) \
385     macro(LogicalNot, NodeResultBoolean) \
386     macro(ToPrimitive, NodeResultJS | NodeMustGenerate) \
387     macro(ToString, NodeResultJS | NodeMustGenerate) \
388     macro(ToNumber, NodeResultJS | NodeMustGenerate) \
389     macro(ToObject, NodeResultJS | NodeMustGenerate) \
390     macro(CallObjectConstructor, NodeResultJS) \
391     macro(CallStringConstructor, NodeResultJS | NodeMustGenerate) \
392     macro(NumberToStringWithRadix, NodeResultJS | NodeMustGenerate) \
393     macro(NumberToStringWithValidRadixConstant, NodeResultJS) \
394     macro(MakeRope, NodeResultJS) \
395     macro(InByVal, NodeResultBoolean | NodeMustGenerate) \
396     macro(InById, NodeResultBoolean | NodeMustGenerate) \
397     macro(ProfileType, NodeMustGenerate) \
398     macro(ProfileControlFlow, NodeMustGenerate) \
399     macro(SetFunctionName, NodeMustGenerate) \
400     macro(HasOwnProperty, NodeResultBoolean) \
401     \
402     macro(CreateActivation, NodeResultJS) \
403     macro(PushWithScope, NodeResultJS | NodeMustGenerate) \
404     \
405     macro(CreateDirectArguments, NodeResultJS) \
406     macro(PhantomDirectArguments, NodeResultJS | NodeMustGenerate) \
407     macro(PhantomCreateRest, NodeResultJS | NodeMustGenerate) \
408     macro(PhantomSpread, NodeResultJS | NodeMustGenerate) \
409     macro(PhantomNewArrayWithSpread, NodeResultJS | NodeMustGenerate | NodeHasVarArgs) \
410     macro(PhantomNewArrayBuffer, NodeResultJS | NodeMustGenerate) \
411     macro(CreateScopedArguments, NodeResultJS) \
412     macro(CreateClonedArguments, NodeResultJS) \
413     macro(PhantomClonedArguments, NodeResultJS | NodeMustGenerate) \
414     macro(GetFromArguments, NodeResultJS) \
415     macro(PutToArguments, NodeMustGenerate) \
416     macro(GetArgument, NodeResultJS) \
417     \
418     macro(NewFunction, NodeResultJS) \
419     macro(NewGeneratorFunction, NodeResultJS) \
420     macro(NewAsyncGeneratorFunction, NodeResultJS) \
421     macro(NewAsyncFunction, NodeResultJS) \
422     \
423     /* Block terminals. */\
424     macro(Jump, NodeMustGenerate) \
425     macro(Branch, NodeMustGenerate) \
426     macro(Switch, NodeMustGenerate) \
427     macro(EntrySwitch, NodeMustGenerate) \
428     macro(Return, NodeMustGenerate) \
429     macro(TailCall, NodeMustGenerate | NodeHasVarArgs) \
430     macro(DirectTailCall, NodeMustGenerate | NodeHasVarArgs) \
431     macro(TailCallVarargs, NodeMustGenerate) \
432     macro(TailCallForwardVarargs, NodeMustGenerate) \
433     macro(Unreachable, NodeMustGenerate) \
434     macro(Throw, NodeMustGenerate) \
435     macro(ThrowStaticError, NodeMustGenerate) \
436     \
437     /* Count execution. */\
438     macro(CountExecution, NodeMustGenerate) \
439     /* Super sampler. */\
440     macro(SuperSamplerBegin, NodeMustGenerate) \
441     macro(SuperSamplerEnd, NodeMustGenerate) \
442     \
443     /* This is a pseudo-terminal. It means that execution should fall out of DFG at */\
444     /* this point, but execution does continue in the basic block - just in a */\
445     /* different compiler. */\
446     macro(ForceOSRExit, NodeMustGenerate) \
447     \
448     /* Vends a bottom JS value. It is invalid to ever execute this. Useful for cases */\
449     /* where we know that we would have exited but we'd like to still track the control */\
450     /* flow. */\
451     macro(BottomValue, NodeResultJS) \
452     \
453     /* Checks for VM traps. If there is a trap, we'll jettison or call operation operationHandleTraps. */ \
454     macro(CheckTraps, NodeMustGenerate) \
455     /* Write barriers */\
456     macro(StoreBarrier, NodeMustGenerate) \
457     macro(FencedStoreBarrier, NodeMustGenerate) \
458     \
459     /* For-in enumeration opcodes */\
460     macro(GetEnumerableLength, NodeMustGenerate | NodeResultJS) \
461     macro(HasIndexedProperty, NodeResultBoolean | NodeHasVarArgs) \
462     macro(HasStructureProperty, NodeResultBoolean) \
463     macro(HasGenericProperty, NodeResultBoolean) \
464     macro(GetDirectPname, NodeMustGenerate | NodeHasVarArgs | NodeResultJS) \
465     macro(GetPropertyEnumerator, NodeMustGenerate | NodeResultJS) \
466     macro(GetEnumeratorStructurePname, NodeMustGenerate | NodeResultJS) \
467     macro(GetEnumeratorGenericPname, NodeMustGenerate | NodeResultJS) \
468     macro(ToIndexString, NodeResultJS) \
469     /* Nodes for JSMap and JSSet */ \
470     macro(MapHash, NodeResultInt32) \
471     macro(NormalizeMapKey, NodeResultJS) \
472     macro(GetMapBucket, NodeResultJS) \
473     macro(GetMapBucketHead, NodeResultJS) \
474     macro(GetMapBucketNext, NodeResultJS) \
475     macro(LoadKeyFromMapBucket, NodeResultJS) \
476     macro(LoadValueFromMapBucket, NodeResultJS) \
477     macro(SetAdd, NodeMustGenerate | NodeResultJS) \
478     macro(MapSet, NodeMustGenerate | NodeHasVarArgs | NodeResultJS) \
479     /* Nodes for JSWeakMap and JSWeakSet */ \
480     macro(WeakMapGet, NodeResultJS) \
481     macro(WeakSetAdd, NodeMustGenerate) \
482     macro(WeakMapSet, NodeMustGenerate | NodeHasVarArgs) \
483     macro(ExtractValueFromWeakMapGet, NodeResultJS) \
484     \
485     macro(StringValueOf, NodeMustGenerate | NodeResultJS) \
486     macro(StringSlice, NodeResultJS) \
487     macro(ToLowerCase, NodeResultJS) \
488     /* Nodes for DOM JIT */\
489     macro(CallDOMGetter, NodeResultJS | NodeMustGenerate) \
490     macro(CallDOM, NodeResultJS | NodeMustGenerate) \
491     /* Metadata node that initializes the state for flushed argument types at an entrypoint in the program. */ \
492     /* Currently, we only use this for the blocks an EntrySwitch branches to at the root of the program. */ \
493     /* This is only used in SSA. */ \
494     macro(InitializeEntrypointArguments, NodeMustGenerate) \
495     \
496     /* Used for $vm performance debugging */ \
497     macro(CPUIntrinsic, NodeResultJS | NodeMustGenerate) \
498     \
499     /* Used to provide feedback to the IC profiler. */ \
500     macro(FilterCallLinkStatus, NodeMustGenerate) \
501     macro(FilterGetByIdStatus, NodeMustGenerate) \
502     macro(FilterInByIdStatus, NodeMustGenerate) \
503     macro(FilterPutByIdStatus, NodeMustGenerate) \
504     /* Data view access */ \
505     macro(DataViewGetInt, NodeMustGenerate | NodeResultJS) /* The gets are must generate for now because they do bounds checks */ \
506     macro(DataViewGetFloat, NodeMustGenerate | NodeResultDouble) \
507     macro(DataViewSet, NodeMustGenerate | NodeMustGenerate | NodeHasVarArgs) \
508
509
510 // This enum generates a monotonically increasing id for all Node types,
511 // and is used by the subsequent enum to fill out the id (as accessed via the NodeIdMask).
512 enum NodeType {
513 #define DFG_OP_ENUM(opcode, flags) opcode,
514     FOR_EACH_DFG_OP(DFG_OP_ENUM)
515 #undef DFG_OP_ENUM
516     LastNodeType
517 };
518
519 // Specifies the default flags for each node.
520 inline NodeFlags defaultFlags(NodeType op)
521 {
522     switch (op) {
523 #define DFG_OP_ENUM(opcode, flags) case opcode: return flags;
524     FOR_EACH_DFG_OP(DFG_OP_ENUM)
525 #undef DFG_OP_ENUM
526     default:
527         RELEASE_ASSERT_NOT_REACHED();
528         return 0;
529     }
530 }
531
532 inline bool isAtomicsIntrinsic(NodeType op)
533 {
534     switch (op) {
535     case AtomicsAdd:
536     case AtomicsAnd:
537     case AtomicsCompareExchange:
538     case AtomicsExchange:
539     case AtomicsLoad:
540     case AtomicsOr:
541     case AtomicsStore:
542     case AtomicsSub:
543     case AtomicsXor:
544     case AtomicsIsLockFree:
545         return true;
546     default:
547         return false;
548     }
549 }
550
551 static const unsigned maxNumExtraAtomicsArgs = 2;
552
553 inline unsigned numExtraAtomicsArgs(NodeType op)
554 {
555     switch (op) {
556     case AtomicsLoad:
557         return 0;
558     case AtomicsAdd:
559     case AtomicsAnd:
560     case AtomicsExchange:
561     case AtomicsOr:
562     case AtomicsStore:
563     case AtomicsSub:
564     case AtomicsXor:
565         return 1;
566     case AtomicsCompareExchange:
567         return 2;
568     default:
569         RELEASE_ASSERT_NOT_REACHED();
570         return 0;
571     }
572 }
573
574 } } // namespace JSC::DFG
575
576 #endif // ENABLE(DFG_JIT)