1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef ECMASCRIPT_COMPILER_STUB_BUILDER_H
17 #define ECMASCRIPT_COMPILER_STUB_BUILDER_H
18 
19 #include "ecmascript/base/config.h"
20 #include "ecmascript/compiler/call_signature.h"
21 #include "ecmascript/compiler/circuit_builder.h"
22 #include "ecmascript/compiler/lcr_gate_meta_data.h"
23 #include "ecmascript/compiler/profiler_operation.h"
24 #include "ecmascript/compiler/share_gate_meta_data.h"
25 #include "ecmascript/compiler/variable_type.h"
26 
27 namespace panda::ecmascript::kungfu {
28 struct StringInfoGateRef;
29 using namespace panda::ecmascript;
30 // NOLINTNEXTLINE(cppcoreguidelines-macro-usage)
31 #define DEFVARIABLE(varname, type, val) Variable varname(GetEnvironment(), type, NextVariableId(), val)
32 
33 #define SUBENTRY(messageId, condition)                                              \
34     GateRef glueArg = PtrArgument(0);                                               \
35     auto env = GetEnvironment();                                                    \
36     Label subEntry(env);                                                            \
37     env->SubCfgEntry(&subEntry);                                                    \
38     Label nextLabel(env);                                                           \
39     Assert(messageId, __LINE__, glueArg, condition, &nextLabel);                    \
40     Bind(&nextLabel)
41 #define SUBENTRY_WITH_GLUE(messageId, condition, glueArg)                           \
42     auto env = GetEnvironment();                                                    \
43     Label subEntry(env);                                                            \
44     env->SubCfgEntry(&subEntry);                                                    \
45     Label nextLabel(env);                                                           \
46     Assert(messageId, __LINE__, glueArg, condition, &nextLabel);                    \
47     Bind(&nextLabel)
48 
49 #ifndef NDEBUG
50 #define ASM_ASSERT(messageId, condition)                                            \
51     if (!GetEnvironment()->GetCircuit()->IsOptimizedOrFastJit() &&                  \
52         !GetEnvironment()->IsBaselineBuiltin()) {                                   \
53         SUBENTRY(messageId, condition);                                             \
54         EXITENTRY();                                                                \
55     }
56 #define ASM_ASSERT_WITH_GLUE(messageId, condition, glue)                            \
57     SUBENTRY_WITH_GLUE(messageId, condition, glue)
58 #elif defined(ENABLE_ASM_ASSERT)
59 #define ASM_ASSERT(messageId, condition)                                            \
60     if (!GetEnvironment()->GetCircuit()->IsOptimizedOrFastJit() &&                  \
61         !GetEnvironment()->IsBaselineBuiltin()) {                                   \
62         SUBENTRY(messageId, condition);                                             \
63         EXITENTRY();                                                                \
64     }
65 #define ASM_ASSERT_WITH_GLUE(messageId, condition, glue)                            \
66     SUBENTRY_WITH_GLUE(messageId, condition, glue)
67 #else
68 #define ASM_ASSERT(messageId, ...) ((void)0)
69 #define ASM_ASSERT_WITH_GLUE(messageId, ...) ((void)0)
70 #endif
71 
72 #ifndef NDEBUG
73 #define EXITENTRY()                                                                 \
74     GetEnvironment()->SubCfgExit()
75 #elif defined(ENABLE_ASM_ASSERT)
76 #define EXITENTRY()                                                                 \
77     GetEnvironment()->SubCfgExit()
78 #else
79 #define EXITENTRY() ((void)0)
80 #endif
81 
82 class StubBuilder {
83 public:
StubBuilder(StubBuilder *parent)84     explicit StubBuilder(StubBuilder *parent)
85         : callSignature_(parent->GetCallSignature()), env_(parent->GetEnvironment()) {}
StubBuilder(CallSignature *callSignature, Environment *env)86     StubBuilder(CallSignature *callSignature, Environment *env)
87         : callSignature_(callSignature), env_(env) {}
StubBuilder(Environment *env)88     explicit StubBuilder(Environment *env)
89         : env_(env) {}
90     virtual ~StubBuilder() = default;
91     NO_MOVE_SEMANTIC(StubBuilder);
92     NO_COPY_SEMANTIC(StubBuilder);
93     virtual void GenerateCircuit() = 0;
GetEnvironment() const94     Environment *GetEnvironment() const
95     {
96         return env_;
97     }
GetCallSignature() const98     CallSignature *GetCallSignature() const
99     {
100         return callSignature_;
101     }
102     int NextVariableId();
103     // constant
104     GateRef Int8(int8_t value);
105     GateRef Int16(int16_t value);
106     GateRef Int32(int32_t value);
107     GateRef Int64(int64_t value);
108     GateRef TaggedInt(int32_t value);
109     GateRef StringPtr(std::string_view str);
110     GateRef IntPtr(int64_t value);
111     GateRef IntPtrSize();
112     GateRef RelocatableData(uint64_t value);
113     GateRef True();
114     GateRef False();
115     GateRef Boolean(bool value);
116     GateRef Double(double value);
117     GateRef Undefined();
118     GateRef Hole();
119     GateRef SpecialHole();
120     GateRef Null();
121     GateRef NullPtr();
122     GateRef Exception();
123     // parameter
124     GateRef Argument(size_t index);
125     GateRef Int1Argument(size_t index);
126     GateRef Int32Argument(size_t index);
127     GateRef Int64Argument(size_t index);
128     GateRef TaggedArgument(size_t index);
129     GateRef TaggedPointerArgument(size_t index);
130     GateRef PtrArgument(size_t index);
131     GateRef Float32Argument(size_t index);
132     GateRef Float64Argument(size_t index);
133     GateRef Alloca(int size);
134     // control flow
135     GateRef Return(GateRef value);
136     GateRef Return();
137     void Bind(Label *label);
138     void Jump(Label *label);
139 
140 #define BRANCH(condition, trueLabel, falseLabel)                       \
141     {                                                                  \
142         std::ostringstream os;                                         \
143         os << __func__ << ": " << #trueLabel << "- " << #falseLabel;   \
144         Branch(condition, trueLabel, falseLabel, os.str().c_str());    \
145     }
146 
147     void Branch(GateRef condition, Label *trueLabel, Label *falseLabel, const char *comment = nullptr);
148 
149 #define BRANCH_LIKELY(condition, trueLabel, falseLabel)                                  \
150     {                                                                                    \
151         std::ostringstream os;                                                           \
152         os << __func__ << ": " << #trueLabel << "(likely)- " << #falseLabel;             \
153         BranchPredict(condition, trueLabel, falseLabel,                                  \
154             BranchWeight::DEOPT_WEIGHT, BranchWeight::ONE_WEIGHT, os.str().c_str());     \
155     }
156 
157 #define BRANCH_UNLIKELY(condition, trueLabel, falseLabel)                                \
158     {                                                                                    \
159         std::ostringstream os;                                                           \
160         os << __func__ << ": " << #trueLabel << "(unlikely)- " << #falseLabel;           \
161         BranchPredict(condition, trueLabel, falseLabel,                                  \
162             BranchWeight::ONE_WEIGHT, BranchWeight::DEOPT_WEIGHT, os.str().c_str());     \
163     }
164 
165 #define BRANCH_NO_WEIGHT(condition, trueLabel, falseLabel)                               \
166     {                                                                                    \
167         std::ostringstream os;                                                           \
168         os << __func__ << ": " << #trueLabel << "(no weight)- " << #falseLabel;          \
169         BranchPredict(condition, trueLabel, falseLabel,                                  \
170             BranchWeight::ZERO_WEIGHT, BranchWeight::ZERO_WEIGHT, os.str().c_str());     \
171     }
172 
173     void BranchPredict(GateRef condition, Label *trueLabel, Label *falseLabel,
174                        uint32_t trueWeight = BranchWeight::ONE_WEIGHT, uint32_t falseWeight = BranchWeight::ONE_WEIGHT,
175                        const char *comment = nullptr);
176 
177     void Switch(GateRef index, Label *defaultLabel, int64_t *keysValue, Label *keysLabel, int numberOfKeys);
178     void LoopBegin(Label *loopHead);
179     void LoopEnd(Label *loopHead);
180     /// LoopEnd with safepoint
181     void LoopEnd(Label *loopHead, Environment *env, GateRef glue);
182     GateRef CheckSuspend(GateRef glue);
183     // call operation
184     GateRef CallRuntime(GateRef glue, int index, const std::vector<GateRef>& args);
185     GateRef CallRuntime(GateRef glue, int index, GateRef argc, GateRef argv);
186     GateRef CallNGCRuntime(GateRef glue, int index,
187                            const std::vector<GateRef>& args, GateRef hir = Circuit::NullGate());
188     GateRef FastCallOptimized(GateRef glue, GateRef code,
189                               const std::vector<GateRef>& args, GateRef hir = Circuit::NullGate());
190     GateRef CallOptimized(GateRef glue, GateRef code,
191                           const std::vector<GateRef>& args, GateRef hir = Circuit::NullGate());
192     GateRef GetAotCodeAddr(GateRef jsFunc);
193     GateRef CallStub(GateRef glue, int index, const std::initializer_list<GateRef>& args);
194     GateRef CallBuiltinRuntime(GateRef glue, const std::initializer_list<GateRef>& args, bool isNew = false);
195     GateRef CallBuiltinRuntimeWithNewTarget(GateRef glue, const std::initializer_list<GateRef>& args);
196     void DebugPrint(GateRef thread, std::initializer_list<GateRef> args);
197     void FatalPrint(GateRef thread, std::initializer_list<GateRef> args);
198     // memory
199     GateRef Load(VariableType type, GateRef base, GateRef offset);
200     GateRef Load(VariableType type, GateRef base);
201     void Store(VariableType type,
202                GateRef glue,
203                GateRef base,
204                GateRef offset,
205                GateRef value,
206                MemoryAttribute mAttr = MemoryAttribute::Default());
207     // arithmetic
208     GateRef TaggedCastToIntPtr(GateRef x);
209     GateRef Int16Add(GateRef x, GateRef y);
210     GateRef Int32Add(GateRef x, GateRef y);
211     GateRef Int64Add(GateRef x, GateRef y);
212     GateRef DoubleAdd(GateRef x, GateRef y);
213     GateRef PtrAdd(GateRef x, GateRef y);
214     GateRef PtrSub(GateRef x, GateRef y);
215     GateRef PtrMul(GateRef x, GateRef y);
216     GateRef IntPtrEqual(GateRef x, GateRef y);
217     GateRef Int16Sub(GateRef x, GateRef y);
218     GateRef Int32Sub(GateRef x, GateRef y);
219     GateRef Int64Sub(GateRef x, GateRef y);
220     GateRef DoubleSub(GateRef x, GateRef y);
221     GateRef Int32Mul(GateRef x, GateRef y);
222     GateRef Int64Mul(GateRef x, GateRef y);
223     GateRef DoubleMul(GateRef x, GateRef y);
224     GateRef DoubleDiv(GateRef x, GateRef y);
225     GateRef Int32Div(GateRef x, GateRef y);
226     GateRef Int32Mod(GateRef x, GateRef y);
227     GateRef DoubleMod(GateRef x, GateRef y);
228     GateRef Int64Div(GateRef x, GateRef y);
229     GateRef IntPtrDiv(GateRef x, GateRef y);
230     // bit operation
231     GateRef Int32Or(GateRef x, GateRef y);
232     GateRef Int8And(GateRef x, GateRef y);
233     GateRef Int8Xor(GateRef x, GateRef y);
234     GateRef Int32And(GateRef x, GateRef y);
235     GateRef IntPtrAnd(GateRef x, GateRef y);
236     GateRef BitAnd(GateRef x, GateRef y);
237     GateRef BitOr(GateRef x, GateRef y);
238     GateRef Int32Not(GateRef x);
239     GateRef IntPtrNot(GateRef x);
240     GateRef BoolNot(GateRef x);
241     GateRef Int32Xor(GateRef x, GateRef y);
242     GateRef FixLoadType(GateRef x);
243     GateRef Int64Or(GateRef x, GateRef y);
244     GateRef IntPtrOr(GateRef x, GateRef y);
245     GateRef Int64And(GateRef x, GateRef y);
246     GateRef Int64Xor(GateRef x, GateRef y);
247     GateRef Int64Not(GateRef x);
248     GateRef Int16LSL(GateRef x, GateRef y);
249     GateRef Int32LSL(GateRef x, GateRef y);
250     GateRef Int64LSL(GateRef x, GateRef y);
251     GateRef IntPtrLSL(GateRef x, GateRef y);
252     GateRef Int8LSR(GateRef x, GateRef y);
253     GateRef Int32LSR(GateRef x, GateRef y);
254     GateRef Int64LSR(GateRef x, GateRef y);
255     GateRef IntPtrLSR(GateRef x, GateRef y);
256     GateRef Int32ASR(GateRef x, GateRef y);
257     GateRef TaggedIsInt(GateRef x);
258     GateRef TaggedIsDouble(GateRef x);
259     GateRef TaggedIsObject(GateRef x);
260     GateRef TaggedIsNumber(GateRef x);
261     GateRef TaggedIsNumeric(GateRef x);
262     GateRef TaggedIsHole(GateRef x);
263     GateRef TaggedIsNotHole(GateRef x);
264     GateRef TaggedIsUndefined(GateRef x);
265     GateRef TaggedIsException(GateRef x);
266     GateRef TaggedIsSpecial(GateRef x);
267     GateRef TaggedIsRegularObject(GateRef x);
268     GateRef TaggedIsHeapObject(GateRef x);
269     GateRef TaggedIsAccessor(GateRef x);
270     GateRef ObjectAddressToRange(GateRef x);
271     GateRef RegionInSpace(GateRef region, RegionSpaceFlag space);
272     GateRef RegionInSpace(GateRef region, RegionSpaceFlag spaceBegin, RegionSpaceFlag spaceEnd);
273     GateRef InEdenGeneration(GateRef region);
274     GateRef InYoungGeneration(GateRef region);
275     GateRef InGeneralYoungGeneration(GateRef region);
276     GateRef InGeneralOldGeneration(GateRef region);
277     GateRef InSharedHeap(GateRef region);
278     GateRef InSharedSweepableSpace(GateRef region);
279     GateRef TaggedIsGeneratorObject(GateRef x);
280     GateRef TaggedIsJSArray(GateRef x);
281     GateRef IsTaggedArray(GateRef x);
282     GateRef TaggedIsAsyncGeneratorObject(GateRef x);
283     GateRef TaggedIsJSGlobalObject(GateRef x);
284     GateRef TaggedIsWeak(GateRef x);
285     GateRef TaggedIsPrototypeHandler(GateRef x);
286     GateRef TaggedIsStoreTSHandler(GateRef x);
287     GateRef TaggedIsTransWithProtoHandler(GateRef x);
288     GateRef TaggedIsTransitionHandler(GateRef x);
289     GateRef TaggedIsString(GateRef obj);
290     GateRef TaggedIsStringIterator(GateRef obj);
291     GateRef TaggedIsSharedObj(GateRef obj);
292     GateRef BothAreString(GateRef x, GateRef y);
293     GateRef TaggedIsStringOrSymbol(GateRef obj);
294     GateRef TaggedIsSymbol(GateRef obj);
295     GateRef TaggedIsArrayBuffer(GateRef obj);
296     GateRef TaggedIsProtoChangeMarker(GateRef obj);
297     GateRef GetNextPositionForHash(GateRef last, GateRef count, GateRef size);
298     GateRef DoubleIsNAN(GateRef x);
299     GateRef DoubleIsINF(GateRef x);
300     GateRef DoubleIsNanOrInf(GateRef x);
301     GateRef DoubleAbs(GateRef x);
302     GateRef DoubleIsInteger(GateRef x);
303     GateRef DoubleTrunc(GateRef x);
304     GateRef TaggedIsNull(GateRef x);
305     GateRef TaggedIsUndefinedOrNull(GateRef x);
306     GateRef TaggedIsUndefinedOrNullOrHole(GateRef x);
307     GateRef TaggedIsTrue(GateRef x);
308     GateRef TaggedIsFalse(GateRef x);
309     GateRef TaggedIsBoolean(GateRef x);
310     GateRef TaggedGetInt(GateRef x);
311     GateRef NumberGetInt(GateRef glue, GateRef x);
312     GateRef TaggedGetNumber(GateRef x);
313     GateRef Int8ToTaggedInt(GateRef x);
314     GateRef Int16ToTaggedInt(GateRef x);
315     GateRef IntToTaggedPtr(GateRef x);
316     GateRef IntToTaggedInt(GateRef x);
317     GateRef Int64ToTaggedInt(GateRef x);
318     GateRef Int64ToTaggedIntPtr(GateRef x);
319     GateRef DoubleToTaggedDoublePtr(GateRef x);
320     GateRef BooleanToTaggedBooleanPtr(GateRef x);
321     GateRef TaggedPtrToTaggedDoublePtr(GateRef x);
322     GateRef TaggedPtrToTaggedIntPtr(GateRef x);
323     GateRef CastDoubleToInt64(GateRef x);
324     GateRef CastFloat32ToInt32(GateRef x);
325     GateRef TaggedTrue();
326     GateRef TaggedFalse();
327     GateRef TaggedUndefined();
328     // compare operation
329     GateRef Int8Equal(GateRef x, GateRef y);
330     GateRef Int8GreaterThanOrEqual(GateRef x, GateRef y);
331     GateRef Equal(GateRef x, GateRef y);
332     GateRef NotEqual(GateRef x, GateRef y);
333     GateRef Int32Equal(GateRef x, GateRef y);
334     GateRef Int32NotEqual(GateRef x, GateRef y);
335     GateRef Int64Equal(GateRef x, GateRef y);
336     GateRef DoubleEqual(GateRef x, GateRef y);
337     GateRef DoubleNotEqual(GateRef x, GateRef y);
338     GateRef Int64NotEqual(GateRef x, GateRef y);
339     GateRef DoubleLessThan(GateRef x, GateRef y);
340     GateRef DoubleLessThanOrEqual(GateRef x, GateRef y);
341     GateRef DoubleGreaterThan(GateRef x, GateRef y);
342     GateRef DoubleGreaterThanOrEqual(GateRef x, GateRef y);
343     GateRef Int32GreaterThan(GateRef x, GateRef y);
344     GateRef Int32LessThan(GateRef x, GateRef y);
345     GateRef Int32GreaterThanOrEqual(GateRef x, GateRef y);
346     GateRef Int32LessThanOrEqual(GateRef x, GateRef y);
347     GateRef Int32UnsignedGreaterThan(GateRef x, GateRef y);
348     GateRef Int32UnsignedLessThan(GateRef x, GateRef y);
349     GateRef Int32UnsignedGreaterThanOrEqual(GateRef x, GateRef y);
350     GateRef Int32UnsignedLessThanOrEqual(GateRef x, GateRef y);
351     GateRef Int64GreaterThan(GateRef x, GateRef y);
352     GateRef Int64LessThan(GateRef x, GateRef y);
353     GateRef Int64LessThanOrEqual(GateRef x, GateRef y);
354     GateRef Int64GreaterThanOrEqual(GateRef x, GateRef y);
355     GateRef Int64UnsignedLessThanOrEqual(GateRef x, GateRef y);
356     GateRef Int64UnsignedGreaterThan(GateRef x, GateRef y);
357     GateRef Int64UnsignedGreaterThanOrEqual(GateRef x, GateRef y);
358     GateRef IntPtrGreaterThan(GateRef x, GateRef y);
359     // cast operation
360     GateRef ChangeInt64ToIntPtr(GateRef val);
361     GateRef ZExtInt32ToPtr(GateRef val);
362     GateRef ChangeIntPtrToInt32(GateRef val);
363     GateRef ToLength(GateRef glue, GateRef target);
364     GateRef ToIndex(GateRef glue, GateRef tagged);
365 
366     // math operation
367     GateRef Sqrt(GateRef x);
368     GateRef GetSetterFromAccessor(GateRef accessor);
369     GateRef GetElementsArray(GateRef object);
370     void SetElementsArray(VariableType type, GateRef glue, GateRef object, GateRef elementsArray,
371                           MemoryAttribute mAttr = MemoryAttribute::Default());
372     GateRef GetPropertiesArray(GateRef object);
373     // SetProperties in js_object.h
374     void SetPropertiesArray(VariableType type, GateRef glue, GateRef object, GateRef propsArray,
375                             MemoryAttribute mAttr = MemoryAttribute::Default());
376     GateRef GetHash(GateRef object);
377     void SetHash(GateRef glue, GateRef object, GateRef hash);
378     GateRef GetLengthOfTaggedArray(GateRef array);
379     GateRef GetLengthOfJSTypedArray(GateRef array);
380     GateRef GetExtractLengthOfTaggedArray(GateRef array);
381     // object operation
382     GateRef IsJSHClass(GateRef obj);
383     GateRef LoadHClass(GateRef object);
384     void CanNotConvertNotValidObject(GateRef obj);
385     void IsNotPropertyKey(GateRef obj);
386     GateRef CreateDataProperty(GateRef glue, GateRef obj, GateRef proKey, GateRef value);
387     GateRef CreateDataPropertyOrThrow(GateRef glue, GateRef onj, GateRef proKey, GateRef value);
388     GateRef DefineField(GateRef glue, GateRef obj, GateRef proKey, GateRef value);
389     void StoreHClass(GateRef glue, GateRef object, GateRef hClass);
390     void StoreHClassWithoutBarrier(GateRef glue, GateRef object, GateRef hClass);
391     void StoreBuiltinHClass(GateRef glue, GateRef object, GateRef hClass);
392     void StorePrototype(GateRef glue, GateRef hclass, GateRef prototype);
393     void CopyAllHClass(GateRef glue, GateRef dstHClass, GateRef scrHClass);
394     GateRef GetObjectType(GateRef hClass);
395     GateRef IsDictionaryMode(GateRef object);
396     GateRef IsDictionaryModeByHClass(GateRef hClass);
397     GateRef IsDictionaryElement(GateRef hClass);
398     GateRef IsStableElements(GateRef hClass);
399     GateRef HasConstructorByHClass(GateRef hClass);
400     GateRef HasConstructor(GateRef object);
401     GateRef IsClassConstructorFromBitField(GateRef bitfield);
402     GateRef IsClassConstructor(GateRef object);
403     GateRef IsClassPrototype(GateRef object);
404     GateRef IsExtensible(GateRef object);
405     GateRef TaggedObjectIsEcmaObject(GateRef obj);
406     GateRef IsEcmaObject(GateRef obj);
407     GateRef IsDataView(GateRef obj);
408     GateRef IsSymbol(GateRef obj);
409     GateRef IsString(GateRef obj);
410     GateRef IsLineString(GateRef obj);
411     GateRef IsSlicedString(GateRef obj);
412     GateRef IsConstantString(GateRef obj);
413     GateRef IsLiteralString(GateRef obj);
414     GateRef IsTreeString(GateRef obj);
415     GateRef TreeStringIsFlat(GateRef string);
416     GateRef TaggedIsBigInt(GateRef obj);
417     GateRef TaggedIsPropertyBox(GateRef obj);
418     GateRef TaggedObjectIsBigInt(GateRef obj);
419     GateRef IsJsProxy(GateRef obj);
420     GateRef IsJSShared(GateRef obj);
421     GateRef IsProfileTypeInfoCell0(GateRef obj);
422     GateRef IsJSGlobalObject(GateRef obj);
423     GateRef IsNativeModuleFailureInfo(GateRef obj);
424     GateRef IsModuleNamespace(GateRef obj);
425     GateRef IsSourceTextModule(GateRef obj);
426     GateRef ObjIsSpecialContainer(GateRef obj);
427     GateRef IsJSPrimitiveRef(GateRef obj);
428     GateRef IsJSFunctionBase(GateRef obj);
429     GateRef IsConstructor(GateRef object);
430     GateRef IsBase(GateRef func);
431     GateRef IsDerived(GateRef func);
432     GateRef IsJsArray(GateRef obj);
433     GateRef IsJsSArray(GateRef obj);
434     GateRef IsByteArray(GateRef obj);
435     GateRef IsJsCOWArray(GateRef obj);
436     GateRef IsCOWArray(GateRef obj);
437     GateRef IsMutantTaggedArray(GateRef elements);
438     GateRef IsJSObject(GateRef obj);
439     GateRef IsEnumerable(GateRef attr);
440     GateRef IsWritable(GateRef attr);
441     GateRef IsConfigable(GateRef attr);
442     GateRef IsDefaultAttribute(GateRef attr);
443     GateRef IsArrayLengthWritable(GateRef glue, GateRef receiver);
444     GateRef IsAccessor(GateRef attr);
445     GateRef IsInlinedProperty(GateRef attr);
446     GateRef IsField(GateRef attr);
447     GateRef IsNonSharedStoreField(GateRef attr);
448     GateRef IsStoreShared(GateRef attr);
449     GateRef IsElement(GateRef attr);
450     GateRef IsStringElement(GateRef attr);
451     GateRef IsNumber(GateRef attr);
452     GateRef IsStringLength(GateRef attr);
453     GateRef IsTypedArrayElement(GateRef attr);
454     GateRef IsNonExist(GateRef attr);
455     GateRef IsJSAPIVector(GateRef attr);
456     GateRef IsJSAPIStack(GateRef obj);
457     GateRef IsJSAPIPlainArray(GateRef obj);
458     GateRef IsJSAPIQueue(GateRef obj);
459     GateRef IsJSAPIDeque(GateRef obj);
460     GateRef IsJSAPILightWeightMap(GateRef obj);
461     GateRef IsJSAPILightWeightSet(GateRef obj);
462     GateRef IsLinkedNode(GateRef obj);
463     GateRef IsJSAPIHashMap(GateRef obj);
464     GateRef IsJSAPIHashSet(GateRef obj);
465     GateRef IsJSAPILinkedList(GateRef obj);
466     GateRef IsJSAPIList(GateRef obj);
467     GateRef IsJSAPIArrayList(GateRef obj);
468     GateRef IsJSCollator(GateRef obj);
469     GateRef IsJSObjectType(GateRef obj, JSType jsType);
470     GateRef IsJSRegExp(GateRef obj);
471     GateRef GetTarget(GateRef proxyObj);
472     GateRef HandlerBaseIsAccessor(GateRef attr);
473     GateRef HandlerBaseIsJSArray(GateRef attr);
474     GateRef HandlerBaseIsInlinedProperty(GateRef attr);
475     GateRef HandlerBaseGetOffset(GateRef attr);
476     GateRef HandlerBaseGetAttrIndex(GateRef attr);
477     GateRef HandlerBaseGetRep(GateRef attr);
478     GateRef IsInvalidPropertyBox(GateRef obj);
479     GateRef IsAccessorPropertyBox(GateRef obj);
480     GateRef GetValueFromPropertyBox(GateRef obj);
481     void SetValueToPropertyBox(GateRef glue, GateRef obj, GateRef value);
482     GateRef GetTransitionHClass(GateRef obj);
483     GateRef GetTransitionHandlerInfo(GateRef obj);
484     GateRef GetTransWithProtoHClass(GateRef obj);
485     GateRef GetTransWithProtoHandlerInfo(GateRef obj);
486     GateRef GetProtoCell(GateRef object);
487     GateRef GetPrototypeHandlerHolder(GateRef object);
488     GateRef GetPrototypeHandlerHandlerInfo(GateRef object);
489     GateRef GetStoreTSHandlerHolder(GateRef object);
490     GateRef GetStoreTSHandlerHandlerInfo(GateRef object);
491     inline GateRef GetLengthOfJSArray(GateRef array);
492     inline GateRef GetPrototype(GateRef glue, GateRef object);
493     GateRef GetHasChanged(GateRef object);
494     GateRef HclassIsPrototypeHandler(GateRef hClass);
495     GateRef HclassIsTransitionHandler(GateRef hClass);
496     GateRef HclassIsPropertyBox(GateRef hClass);
497     GateRef PropAttrGetOffset(GateRef attr);
498     GateRef GetCtorPrototype(GateRef ctor);
499     GateRef HasFunctionPrototype(GateRef ctor);
500     GateRef InstanceOf(GateRef glue, GateRef object, GateRef target, GateRef profileTypeInfo, GateRef slotId,
501         ProfileOperation callback);
502     GateRef OrdinaryHasInstance(GateRef glue, GateRef target, GateRef obj);
503     void TryFastHasInstance(GateRef glue, GateRef instof, GateRef target, GateRef object, Label *fastPath,
504                             Label *exit, Variable *result, ProfileOperation callback);
505     GateRef ConvertTaggedValueWithElementsKind(GateRef glue, GateRef value, GateRef extraKind);
506     GateRef SameValue(GateRef glue, GateRef left, GateRef right);
507     GateRef SameValueZero(GateRef glue, GateRef left, GateRef right);
508     GateRef HasStableElements(GateRef glue, GateRef obj);
509     GateRef IsStableJSArguments(GateRef glue, GateRef obj);
510     GateRef IsStableJSArray(GateRef glue, GateRef obj);
511     GateRef IsTypedArray(GateRef obj);
512     GateRef IsStableArguments(GateRef hClass);
513     GateRef IsStableArray(GateRef hClass);
514     GateRef GetProfileTypeInfo(GateRef jsFunc);
515     GateRef UpdateProfileTypeInfo(GateRef glue, GateRef jsFunc);
516     // SetDictionaryOrder func in property_attribute.h
517     GateRef SetDictionaryOrderFieldInPropAttr(GateRef attr, GateRef value);
518     GateRef GetPrototypeFromHClass(GateRef hClass);
519     GateRef GetEnumCacheFromHClass(GateRef hClass);
520     GateRef GetProtoChangeMarkerFromHClass(GateRef hClass);
521     GateRef GetLayoutFromHClass(GateRef hClass);
522     GateRef GetBitFieldFromHClass(GateRef hClass);
523     GateRef GetLengthFromString(GateRef value);
524     GateRef CalcHashcodeForInt(GateRef value);
525     void CalcHashcodeForDouble(GateRef value, Variable *res, Label *exit);
526     void CalcHashcodeForObject(GateRef glue, GateRef value, Variable *res, Label *exit);
527     GateRef GetHashcodeFromString(GateRef glue, GateRef value, GateRef hir = Circuit::NullGate());
528     inline GateRef IsIntegerString(GateRef string);
529     inline void SetRawHashcode(GateRef glue, GateRef str, GateRef rawHashcode, GateRef isInteger);
530     inline GateRef GetRawHashFromString(GateRef value);
531     GateRef TryGetHashcodeFromString(GateRef string);
532     inline GateRef GetMixHashcode(GateRef string);
533     GateRef GetFirstFromTreeString(GateRef string);
534     GateRef GetSecondFromTreeString(GateRef string);
535     GateRef GetIsAllTaggedPropFromHClass(GateRef hclass);
536     void SetBitFieldToHClass(GateRef glue, GateRef hClass, GateRef bitfield);
537     void SetIsAllTaggedProp(GateRef glue, GateRef hclass, GateRef hasRep);
538     void SetPrototypeToHClass(VariableType type, GateRef glue, GateRef hClass, GateRef proto);
539     void SetProtoChangeDetailsToHClass(VariableType type, GateRef glue, GateRef hClass,
540                                        GateRef protoChange);
541     void SetLayoutToHClass(VariableType type, GateRef glue, GateRef hClass, GateRef attr,
542                            MemoryAttribute mAttr = MemoryAttribute::Default());
543     void SetHClassTypeIDToHClass(GateRef glue, GateRef hClass, GateRef id);
544     void SetEnumCacheToHClass(VariableType type, GateRef glue, GateRef hClass, GateRef key);
545     void SetTransitionsToHClass(VariableType type, GateRef glue, GateRef hClass, GateRef transition);
546     void SetParentToHClass(VariableType type, GateRef glue, GateRef hClass, GateRef parent);
547     void SetIsProtoTypeToHClass(GateRef glue, GateRef hClass, GateRef value);
548     inline void SetIsTS(GateRef glue, GateRef hClass, GateRef value);
549     GateRef IsProtoTypeHClass(GateRef hClass);
550     void SetPropertyInlinedProps(GateRef glue, GateRef obj, GateRef hClass,
551                                  GateRef value, GateRef attrOffset, VariableType type = VariableType::JS_ANY(),
552                                  MemoryAttribute mAttr = MemoryAttribute::Default());
553     GateRef GetPropertyInlinedProps(GateRef obj, GateRef hClass,
554         GateRef index);
555     GateRef GetInlinedPropOffsetFromHClass(GateRef hclass, GateRef attrOffset);
556 
557     void IncNumberOfProps(GateRef glue, GateRef hClass);
558     GateRef GetNumberOfPropsFromHClass(GateRef hClass);
559     GateRef HasDeleteProperty(GateRef hClass);
560     GateRef IsTSHClass(GateRef hClass);
561     void SetNumberOfPropsToHClass(GateRef glue, GateRef hClass, GateRef value);
562     void SetElementsKindToTrackInfo(GateRef glue, GateRef trackInfo, GateRef elementsKind);
563     void SetSpaceFlagToTrackInfo(GateRef glue, GateRef trackInfo, GateRef spaceFlag);
564     GateRef GetElementsKindFromHClass(GateRef hClass);
565     GateRef GetObjectSizeFromHClass(GateRef hClass);
566     GateRef GetInlinedPropsStartFromHClass(GateRef hClass);
567     GateRef GetInlinedPropertiesFromHClass(GateRef hClass);
568     void ThrowTypeAndReturn(GateRef glue, int messageId, GateRef val);
569     GateRef GetValueFromTaggedArray(GateRef elements, GateRef index);
570     GateRef GetDataPtrInTaggedArray(GateRef array);
571     GateRef GetUnsharedConstpoolIndex(GateRef constpool);
572     GateRef GetUnsharedConstpoolFromGlue(GateRef glue, GateRef constpool);
573     GateRef GetUnsharedConstpool(GateRef array, GateRef index);
574     GateRef GetValueFromMutantTaggedArray(GateRef elements, GateRef index);
575     void CheckUpdateSharedType(bool isDicMode, Variable *result, GateRef glue, GateRef receiver, GateRef attr,
576                                GateRef value, Label *executeSetProp, Label *exit);
577     void CheckUpdateSharedType(bool isDicMode, Variable *result, GateRef glue, GateRef receiver, GateRef attr,
578                                GateRef value, Label *executeSetProp, Label *exit, GateRef SCheckModelIsCHECK);
579     void MatchFieldType(Variable *result, GateRef glue, GateRef fieldType, GateRef value, Label *executeSetProp,
580                                Label *exit);
581     GateRef GetFieldTypeFromHandler(GateRef attr);
582     GateRef ClearSharedStoreKind(GateRef handlerInfo);
583     GateRef UpdateSOutOfBoundsForHandler(GateRef handlerInfo);
584     void RestoreElementsKindToGeneric(GateRef glue, GateRef jsHClass);
585     GateRef GetTaggedValueWithElementsKind(GateRef receiver, GateRef index);
586     void FastSetValueWithElementsKind(GateRef glue, GateRef elements, GateRef rawValue,
587                                       GateRef index, ElementsKind kind);
588     GateRef SetValueWithElementsKind(GateRef glue, GateRef receiver, GateRef rawValue, GateRef index,
589                                      GateRef needTransition, GateRef extraKind);
590     GateRef CopyJSArrayToTaggedArrayArgs(GateRef glue, GateRef srcObj);
591     void SetValueToTaggedArrayWithAttr(
592         GateRef glue, GateRef array, GateRef index, GateRef key, GateRef val, GateRef attr);
593     void SetValueToTaggedArrayWithRep(
594         GateRef glue, GateRef array, GateRef index, GateRef val, GateRef rep, Label *repChange);
595 
596     void SetValueToTaggedArray(VariableType valType, GateRef glue, GateRef array, GateRef index, GateRef val,
597                                MemoryAttribute mAttr = MemoryAttribute::Default());
598     void UpdateValueAndAttributes(GateRef glue, GateRef elements, GateRef index, GateRef value, GateRef attr);
599     GateRef IsSpecialIndexedObj(GateRef jsType);
600     GateRef IsSpecialContainer(GateRef jsType);
601     GateRef IsSharedArray(GateRef jsType);
602     GateRef IsAccessorInternal(GateRef value);
603     template<typename DictionaryT>
604     GateRef GetAttributesFromDictionary(GateRef elements, GateRef entry);
605     template<typename DictionaryT>
606     GateRef GetValueFromDictionary(GateRef elements, GateRef entry);
607     template<typename DictionaryT>
608     GateRef GetKeyFromDictionary(GateRef elements, GateRef entry);
609     GateRef GetPropAttrFromLayoutInfo(GateRef layout, GateRef entry);
610     void UpdateFieldType(GateRef glue, GateRef hclass, GateRef attr);
611     GateRef GetPropertiesAddrFromLayoutInfo(GateRef layout);
612     GateRef GetPropertyMetaDataFromAttr(GateRef attr);
613     GateRef TranslateToRep(GateRef value);
614     GateRef GetKeyFromLayoutInfo(GateRef layout, GateRef entry);
615     void MatchFieldType(GateRef glue, GateRef fieldType, GateRef value, Label *executeSetProp, Label *typeMismatch);
616     GateRef FindElementWithCache(GateRef glue, GateRef layoutInfo, GateRef hClass,
617         GateRef key, GateRef propsNum, GateRef hir = Circuit::NullGate());
618     GateRef FindElementFromNumberDictionary(GateRef glue, GateRef elements, GateRef index);
619     GateRef FindEntryFromNameDictionary(GateRef glue, GateRef elements, GateRef key, GateRef hir = Circuit::NullGate());
620     GateRef IsMatchInTransitionDictionary(GateRef element, GateRef key, GateRef metaData, GateRef attr);
621     GateRef FindEntryFromTransitionDictionary(GateRef glue, GateRef elements, GateRef key, GateRef metaData);
622     GateRef JSObjectGetProperty(GateRef obj, GateRef hClass, GateRef propAttr);
623     void JSObjectSetProperty(GateRef glue, GateRef obj, GateRef hClass, GateRef attr, GateRef key, GateRef value);
624     GateRef ShouldCallSetter(GateRef receiver, GateRef holder, GateRef accessor, GateRef attr);
625     GateRef CallSetterHelper(GateRef glue, GateRef holder, GateRef accessor,  GateRef value, ProfileOperation callback);
626     GateRef SetHasConstructorCondition(GateRef glue, GateRef receiver, GateRef key);
627     GateRef AddPropertyByName(GateRef glue, GateRef receiver, GateRef key, GateRef value, GateRef propertyAttributes,
628         ProfileOperation callback);
629     GateRef IsUtf16String(GateRef string);
630     GateRef IsUtf8String(GateRef string);
631     GateRef IsInternalString(GateRef string);
632     GateRef IsDigit(GateRef ch);
633     void TryToGetInteger(GateRef string, Variable *num, Label *success, Label *failed);
634     GateRef StringToElementIndex(GateRef glue, GateRef string);
635     GateRef ComputeElementCapacity(GateRef oldLength);
636     GateRef ComputeNonInlinedFastPropsCapacity(GateRef glue, GateRef oldLength,
637                                                GateRef maxNonInlinedFastPropsCapacity);
638     GateRef FindTransitions(GateRef glue, GateRef hClass, GateRef key, GateRef attr, GateRef value);
639     GateRef CheckHClassForRep(GateRef hClass, GateRef rep);
640     void TransitionForRepChange(GateRef glue, GateRef receiver, GateRef key, GateRef attr);
641     void TransitToElementsKind(GateRef glue, GateRef receiver, GateRef value, GateRef kind);
642     void TryMigrateToGenericKindForJSObject(GateRef glue, GateRef receiver, GateRef oldKind);
643     GateRef TaggedToRepresentation(GateRef value);
644     GateRef TaggedToElementKind(GateRef value);
645     GateRef LdGlobalRecord(GateRef glue, GateRef key);
646     GateRef LoadFromField(GateRef receiver, GateRef handlerInfo);
647     GateRef LoadGlobal(GateRef cell);
648     GateRef LoadElement(GateRef glue, GateRef receiver, GateRef key);
649     GateRef LoadStringElement(GateRef glue, GateRef receiver, GateRef key);
650     GateRef TryToElementsIndex(GateRef glue, GateRef key);
651     GateRef CheckPolyHClass(GateRef cachedValue, GateRef hClass);
652     GateRef LoadICWithHandler(
653         GateRef glue, GateRef receiver, GateRef holder, GateRef handler, ProfileOperation callback);
654     GateRef StoreICWithHandler(GateRef glue, GateRef receiver, GateRef holder,
655                                GateRef value, GateRef handler, ProfileOperation callback = ProfileOperation());
656     GateRef TaggedArraySetValue(GateRef glue, GateRef receiver, GateRef value, GateRef index, GateRef capacity);
657     GateRef ICStoreElement(GateRef glue, GateRef receiver, GateRef key, GateRef value, GateRef handlerInfo,
658                            bool updateHandler = false, GateRef profileTypeInfo = Gate::InvalidGateRef,
659                            GateRef slotId = Gate::InvalidGateRef);
660     GateRef GetArrayLength(GateRef object);
661     GateRef DoubleToInt(GateRef glue, GateRef x, size_t bits = base::INT32_BITS);
662     void SetArrayLength(GateRef glue, GateRef object, GateRef len);
663     GateRef StoreField(GateRef glue, GateRef receiver, GateRef value, GateRef handler, ProfileOperation callback);
664     GateRef StoreWithTransition(GateRef glue, GateRef receiver, GateRef value, GateRef handler,
665                              ProfileOperation callback, bool withPrototype = false);
666     GateRef StoreGlobal(GateRef glue, GateRef value, GateRef cell);
667     void JSHClassAddProperty(GateRef glue, GateRef receiver, GateRef key, GateRef attr, GateRef value);
668     void NotifyHClassChanged(GateRef glue, GateRef oldHClass, GateRef newHClass);
669     GateRef GetInt64OfTInt(GateRef x);
670     GateRef GetInt32OfTInt(GateRef x);
671     GateRef GetDoubleOfTInt(GateRef x);
672     GateRef GetDoubleOfTDouble(GateRef x);
673     GateRef GetInt32OfTNumber(GateRef x);
674     GateRef GetDoubleOfTNumber(GateRef x);
675     GateRef LoadObjectFromWeakRef(GateRef x);
676     GateRef ExtFloat32ToDouble(GateRef x);
677     GateRef ChangeInt32ToFloat32(GateRef x);
678     GateRef ChangeInt32ToFloat64(GateRef x);
679     GateRef ChangeUInt32ToFloat64(GateRef x);
680     GateRef ChangeFloat64ToInt32(GateRef x);
681     GateRef TruncDoubleToFloat32(GateRef x);
682     GateRef DeletePropertyOrThrow(GateRef glue, GateRef obj, GateRef value);
683     inline GateRef ToObject(GateRef glue, GateRef obj);
684     GateRef DeleteProperty(GateRef glue, GateRef obj, GateRef value);
685     inline GateRef OrdinaryNewJSObjectCreate(GateRef glue, GateRef proto);
686     inline GateRef NewJSPrimitiveRef(GateRef glue, size_t index, GateRef obj);
687     GateRef ModuleNamespaceDeleteProperty(GateRef glue, GateRef obj, GateRef value);
688     GateRef Int64ToTaggedPtr(GateRef x);
689     GateRef TruncInt16ToInt8(GateRef x);
690     GateRef TruncInt32ToInt16(GateRef x);
691     GateRef TruncInt32ToInt8(GateRef x);
692     GateRef TruncFloatToInt64(GateRef x);
693     GateRef CastInt32ToFloat32(GateRef x);
694     GateRef CastInt64ToFloat64(GateRef x);
695     GateRef SExtInt32ToInt64(GateRef x);
696     GateRef SExtInt16ToInt64(GateRef x);
697     GateRef SExtInt16ToInt32(GateRef x);
698     GateRef SExtInt8ToInt64(GateRef x);
699     GateRef SExtInt8ToInt32(GateRef x);
700     GateRef SExtInt1ToInt64(GateRef x);
701     GateRef SExtInt1ToInt32(GateRef x);
702     GateRef ZExtInt8ToInt16(GateRef x);
703     GateRef ZExtInt32ToInt64(GateRef x);
704     GateRef ZExtInt1ToInt64(GateRef x);
705     GateRef ZExtInt1ToInt32(GateRef x);
706     GateRef ZExtInt8ToInt32(GateRef x);
707     GateRef ZExtInt8ToInt64(GateRef x);
708     GateRef ZExtInt8ToPtr(GateRef x);
709     GateRef ZExtInt16ToPtr(GateRef x);
710     GateRef SExtInt32ToPtr(GateRef x);
711     GateRef ZExtInt16ToInt32(GateRef x);
712     GateRef ZExtInt16ToInt64(GateRef x);
713     GateRef TruncInt64ToInt32(GateRef x);
714     GateRef TruncPtrToInt32(GateRef x);
715     GateRef TruncInt64ToInt1(GateRef x);
716     GateRef TruncInt32ToInt1(GateRef x);
717     GateRef GetGlobalConstantAddr(GateRef index);
718     GateRef GetGlobalConstantOffset(ConstantIndex index);
719     GateRef IsCallableFromBitField(GateRef bitfield);
720     GateRef IsCallable(GateRef obj);
721     GateRef GetOffsetFieldInPropAttr(GateRef attr);
722     GateRef SetOffsetFieldInPropAttr(GateRef attr, GateRef value);
723     GateRef SetIsInlinePropsFieldInPropAttr(GateRef attr, GateRef value);
724     GateRef SetTrackTypeInPropAttr(GateRef attr, GateRef type);
725     GateRef GetTrackTypeInPropAttr(GateRef attr);
726     GateRef GetSharedFieldTypeInPropAttr(GateRef attr);
727     GateRef GetDictSharedFieldTypeInPropAttr(GateRef attr);
728     GateRef GetRepInPropAttr(GateRef attr);
729     GateRef IsIntRepInPropAttr(GateRef attr);
730     GateRef IsDoubleRepInPropAttr(GateRef attr);
731     GateRef IsTaggedRepInPropAttr(GateRef attr);
732     GateRef SetTaggedRepInPropAttr(GateRef attr);
733     template<class T>
734     void SetHClassBit(GateRef glue, GateRef hClass, GateRef value);
735     template<typename DictionaryT>
736     void UpdateValueInDict(GateRef glue, GateRef elements, GateRef index, GateRef value);
737     GateRef GetBitMask(GateRef bitoffset);
738     GateRef IntPtrEuqal(GateRef x, GateRef y);
739     GateRef IntPtrNotEqual(GateRef x, GateRef y);
740     void SetValueWithAttr(GateRef glue, GateRef obj, GateRef offset, GateRef key, GateRef value, GateRef attr);
741     void SetValueWithRep(GateRef glue, GateRef obj, GateRef offset, GateRef value, GateRef rep, Label *repChange);
742     void VerifyBarrier(GateRef glue, GateRef obj, GateRef offset, GateRef value);
743     void SetValueWithBarrier(GateRef glue, GateRef obj, GateRef offset, GateRef value, bool withEden = false,
744                              MemoryAttribute::ShareFlag share = MemoryAttribute::UNKNOWN);
745     GateRef GetPropertyByIndex(GateRef glue, GateRef receiver, GateRef index,
746                                ProfileOperation callback, GateRef hir = Circuit::NullGate());
747     GateRef GetPropertyByName(GateRef glue, GateRef receiver, GateRef key,
748                               ProfileOperation callback, GateRef isInternal, bool canUseIsInternal = false);
749     GateRef FastGetPropertyByName(GateRef glue, GateRef obj, GateRef key, ProfileOperation callback);
750     GateRef FastGetPropertyByIndex(GateRef glue, GateRef obj, GateRef index,
751                                    ProfileOperation callback, GateRef hir = Circuit::NullGate());
752     GateRef GetPropertyByValue(GateRef glue, GateRef receiver, GateRef keyValue, ProfileOperation callback);
753     void FastSetPropertyByName(GateRef glue, GateRef obj, GateRef key, GateRef value,
754         ProfileOperation callback = ProfileOperation());
755     void FastSetPropertyByIndex(GateRef glue, GateRef obj, GateRef index, GateRef value);
756     GateRef SetPropertyByIndex(GateRef glue, GateRef receiver, GateRef index,
757         GateRef value, bool useOwn, ProfileOperation callback = ProfileOperation(), bool defineSemantics = false);
758     GateRef DefinePropertyByIndex(GateRef glue, GateRef receiver, GateRef index, GateRef value);
759     GateRef SetPropertyByName(GateRef glue, GateRef receiver, GateRef key,
760         GateRef value, bool useOwn, GateRef isInternal, ProfileOperation callback = ProfileOperation(),
761         bool canUseIsInternal = false, bool defineSemantics = false); // Crawl prototype chain
762     GateRef DefinePropertyByName(GateRef glue, GateRef receiver, GateRef key,
763         GateRef value, GateRef isInternal, GateRef SCheckModelIsCHECK,
764         ProfileOperation callback = ProfileOperation());
765     GateRef SetPropertyByValue(GateRef glue, GateRef receiver, GateRef key, GateRef value, bool useOwn,
766         ProfileOperation callback = ProfileOperation(), bool defineSemantics = false);
767     GateRef DefinePropertyByValue(GateRef glue, GateRef receiver, GateRef key, GateRef value,
768         GateRef SCheckModelIsCHECK, ProfileOperation callback = ProfileOperation());
769     GateRef GetParentEnv(GateRef object);
770     GateRef GetSendableParentEnv(GateRef object);
771     GateRef GetPropertiesFromLexicalEnv(GateRef object, GateRef index);
772     GateRef GetPropertiesFromSendableEnv(GateRef object, GateRef index);
773     GateRef GetKeyFromLexivalEnv(GateRef lexicalEnv, GateRef levelIndex, GateRef slotIndex);
774     void SetPropertiesToLexicalEnv(GateRef glue, GateRef object, GateRef index, GateRef value);
775     void SetPropertiesToSendableEnv(GateRef glue, GateRef object, GateRef index, GateRef value);
776     GateRef GetHomeObjectFromJSFunction(GateRef object);
777     GateRef GetCallFieldFromMethod(GateRef method);
778     GateRef GetSendableEnvFromModule(GateRef module);
779     GateRef GetProtoOrHClass(GateRef function);
780     GateRef IsSendableFunctionModule(GateRef module);
781     inline GateRef GetBuiltinId(GateRef method);
782     void SetLexicalEnvToFunction(GateRef glue, GateRef object, GateRef lexicalEnv,
783                                  MemoryAttribute mAttr = MemoryAttribute::Default());
784     void SetProtoTransRootHClassToFunction(GateRef glue, GateRef object, GateRef hclass,
785                                            MemoryAttribute mAttr = MemoryAttribute::Default());
786     void SetProtoOrHClassToFunction(GateRef glue, GateRef function, GateRef value,
787                                     MemoryAttribute mAttr = MemoryAttribute::Default());
788     void SetWorkNodePointerToFunction(GateRef glue, GateRef function, GateRef value,
789                                       MemoryAttribute mAttr = MemoryAttribute::Default());
790     void SetHomeObjectToFunction(GateRef glue, GateRef function, GateRef value,
791                                  MemoryAttribute mAttr = MemoryAttribute::Default());
792     void SetModuleToFunction(GateRef glue, GateRef function, GateRef value,
793                              MemoryAttribute mAttr = MemoryAttribute::Default());
794     void SetMethodToFunction(GateRef glue, GateRef function, GateRef value,
795                              MemoryAttribute mAttr = MemoryAttribute::Default());
796     void SetCodeEntryToFunctionFromMethod(GateRef glue, GateRef function, GateRef value);
797     void SetCodeEntryToFunctionFromFuncEntry(GateRef glue, GateRef function, GateRef value);
798     void SetCompiledCodeFlagToFunctionFromMethod(GateRef glue, GateRef function, GateRef value);
799     void SetLengthToFunction(GateRef glue, GateRef function, GateRef value);
800     void SetRawProfileTypeInfoToFunction(GateRef glue, GateRef function, GateRef value,
801                                          MemoryAttribute mAttr = MemoryAttribute::Default());
802     void SetValueToProfileTypeInfoCell(GateRef glue, GateRef profileTypeInfoCell, GateRef value);
803     void UpdateProfileTypeInfoCellType(GateRef glue, GateRef profileTypeInfoCell);
804     void SetJSObjectTaggedField(GateRef glue, GateRef object, size_t offset, GateRef value);
805     void SetSendableEnvToModule(GateRef glue, GateRef module, GateRef value,
806                                 MemoryAttribute mAttr = MemoryAttribute::Default());
807     void SetCompiledCodeFlagToFunction(GateRef glue, GateRef function, GateRef value);
808     void SetCompiledFastCallFlagToFunction(GateRef glue, GateRef function, GateRef value);
809     void SetCompiledFuncEntry(GateRef glue, GateRef jsFunc, GateRef codeEntry, GateRef isFastCall);
810     GateRef GetFuncEntryDes(GateRef glue, GateRef machineCode, GateRef codeAddr);
811     GateRef GetFuncEntryDesAddress(GateRef machineCode);
812     GateRef IsAlign(GateRef address, GateRef alignByte);
813     void SetTaskConcurrentFuncFlagToFunction(GateRef glue, GateRef function, GateRef value);
814     void SetBitFieldToFunction(GateRef glue, GateRef function, GateRef value);
815     void SetMachineCodeToFunction(GateRef glue, GateRef function, GateRef value,
816                                   MemoryAttribute mAttr = MemoryAttribute::Default());
817     void SetTypedArrayName(GateRef glue, GateRef typedArray, GateRef name,
818                            MemoryAttribute mAttr = MemoryAttribute::Default());
819     void SetContentType(GateRef glue, GateRef typedArray, GateRef type);
820     void SetViewedArrayBufferOrByteArray(GateRef glue, GateRef typedArray, GateRef data,
821                                          MemoryAttribute mAttr = MemoryAttribute::Default());
822     void SetByteLength(GateRef glue, GateRef typedArray, GateRef byteLength);
823     void SetByteOffset(GateRef glue, GateRef typedArray, GateRef offset);
824     void SetTypedArrayLength(GateRef glue, GateRef typedArray, GateRef arrayLength);
825     GateRef GetGlobalObject(GateRef glue);
826     GateRef GetMethodFromFunction(GateRef function);
827     GateRef GetModuleFromFunction(GateRef function);
828     GateRef GetLengthFromFunction(GateRef function);
829     GateRef GetHomeObjectFromFunction(GateRef function);
830     GateRef GetEntryIndexOfGlobalDictionary(GateRef entry);
831     GateRef GetBoxFromGlobalDictionary(GateRef object, GateRef entry);
832     GateRef GetValueFromGlobalDictionary(GateRef object, GateRef entry);
833     GateRef GetPropertiesFromJSObject(GateRef object);
834     template<OpCode Op, MachineType Type>
835     GateRef BinaryOp(GateRef x, GateRef y);
836     template<OpCode Op, MachineType Type>
837     GateRef BinaryOpWithOverflow(GateRef x, GateRef y);
838     GateRef GetGlobalOwnProperty(GateRef glue, GateRef receiver, GateRef key, ProfileOperation callback);
839     GateRef AddElementInternal(GateRef glue, GateRef receiver, GateRef index, GateRef value, GateRef attr);
840     GateRef ShouldTransToDict(GateRef capcity, GateRef index);
841     void NotifyStableArrayElementsGuardians(GateRef glue, GateRef receiver);
842     GateRef GrowElementsCapacity(GateRef glue, GateRef receiver, GateRef capacity);
843 
844     inline GateRef GetObjectFromConstPool(GateRef constpool, GateRef index);
845     GateRef GetConstPoolFromFunction(GateRef jsFunc);
846     GateRef GetStringFromConstPool(GateRef glue, GateRef constpool, GateRef index);
847     GateRef GetMethodFromConstPool(GateRef glue, GateRef constpool, GateRef index);
848     GateRef GetArrayLiteralFromConstPool(GateRef glue, GateRef constpool, GateRef index, GateRef module);
849     GateRef GetObjectLiteralFromConstPool(GateRef glue, GateRef constpool, GateRef index, GateRef module);
850     void SetElementsKindToJSHClass(GateRef glue, GateRef jsHclass, GateRef elementsKind);
851     void SetExtensibleToBitfield(GateRef glue, GateRef obj, bool isExtensible);
852     void SetCallableToBitfield(GateRef glue, GateRef obj, bool isCallable);
853 
854     // fast path
855     GateRef FastEqual(GateRef glue, GateRef left, GateRef right, ProfileOperation callback);
856     GateRef FastStrictEqual(GateRef glue, GateRef left, GateRef right, ProfileOperation callback);
857     GateRef FastStringEqual(GateRef glue, GateRef left, GateRef right);
858     GateRef FastMod(GateRef gule, GateRef left, GateRef right, ProfileOperation callback);
859     GateRef FastTypeOf(GateRef left, GateRef right);
860     GateRef FastMul(GateRef glue, GateRef left, GateRef right, ProfileOperation callback);
861     GateRef FastDiv(GateRef left, GateRef right, ProfileOperation callback);
862     GateRef FastAdd(GateRef glue, GateRef left, GateRef right, ProfileOperation callback);
863     GateRef FastSub(GateRef glue, GateRef left, GateRef right, ProfileOperation callback);
864     GateRef FastToBoolean(GateRef value, bool flag = true);
865     GateRef FastToBooleanWithProfile(GateRef value, ProfileOperation callback, bool flag = true);
866     GateRef FastToBooleanWithProfileBaseline(GateRef value, ProfileOperation callback, bool flag = true);
867 
868     // Add SpecialContainer
869     GateRef GetContainerProperty(GateRef glue, GateRef receiver, GateRef index, GateRef jsType);
870     GateRef JSAPIContainerGet(GateRef glue, GateRef receiver, GateRef index);
871 
872     // for-in
873     GateRef NextInternal(GateRef glue, GateRef iter);
874     GateRef GetLengthFromForInIterator(GateRef iter);
875     GateRef GetIndexFromForInIterator(GateRef iter);
876     GateRef GetKeysFromForInIterator(GateRef iter);
877     GateRef GetObjectFromForInIterator(GateRef iter);
878     GateRef GetCachedHclassFromForInIterator(GateRef iter);
879     void SetLengthOfForInIterator(GateRef glue, GateRef iter, GateRef length);
880     void SetIndexOfForInIterator(GateRef glue, GateRef iter, GateRef index);
881     void SetKeysOfForInIterator(GateRef glue, GateRef iter, GateRef keys);
882     void SetObjectOfForInIterator(GateRef glue, GateRef iter, GateRef object);
883     void SetCachedHclassOfForInIterator(GateRef glue, GateRef iter, GateRef hclass);
884     void IncreaseInteratorIndex(GateRef glue, GateRef iter, GateRef index);
885     void SetNextIndexOfArrayIterator(GateRef glue, GateRef iter, GateRef nextIndex);
886     void SetIteratedArrayOfArrayIterator(GateRef glue, GateRef iter, GateRef iteratedArray);
887     void SetBitFieldOfArrayIterator(GateRef glue, GateRef iter, GateRef kind);
888     GateRef GetEnumCacheKind(GateRef glue, GateRef enumCache);
889     GateRef GetEmptyArray(GateRef glue);
890     GateRef IsEnumCacheValid(GateRef receiver, GateRef cachedHclass, GateRef kind);
891     GateRef NeedCheckProperty(GateRef receiver);
892 
893     GateRef EnumerateObjectProperties(GateRef glue, GateRef obj);
894     GateRef GetFunctionPrototype(GateRef glue, size_t index);
895     GateRef ToPrototypeOrObj(GateRef glue, GateRef obj);
896     GateRef IsSpecialKeysObject(GateRef obj);
897     GateRef IsSlowKeysObject(GateRef obj);
898     GateRef TryGetEnumCache(GateRef glue, GateRef obj);
899     GateRef GetNumberOfElements(GateRef obj);
900     GateRef IsSimpleEnumCacheValid(GateRef obj);
901     GateRef IsEnumCacheWithProtoChainInfoValid(GateRef obj);
902 
903     // Exception handle
904     GateRef HasPendingException(GateRef glue);
905     void ReturnExceptionIfAbruptCompletion(GateRef glue);
906 
907     // ElementsKind Operations
908     GateRef ValueIsSpecialHole(GateRef x);
909     GateRef ElementsKindIsIntOrHoleInt(GateRef kind);
910     GateRef ElementsKindIsNumOrHoleNum(GateRef kind);
911     GateRef ElementsKindIsHeapKind(GateRef kind);
912     GateRef ElementsKindHasHole(GateRef kind);
913     void MigrateArrayWithKind(GateRef glue, GateRef object, GateRef oldKind, GateRef newKind);
914     GateRef MigrateFromRawValueToHeapValues(GateRef glue, GateRef object, GateRef needCOW, GateRef isIntKind);
915     GateRef MigrateFromHeapValueToRawValue(GateRef glue, GateRef object, GateRef needCOW, GateRef isIntKind);
916     void MigrateFromHoleIntToHoleNumber(GateRef glue, GateRef object);
917     void MigrateFromHoleNumberToHoleInt(GateRef glue, GateRef object);
918 
919     // method operator
920     GateRef IsJSFunction(GateRef obj);
921     GateRef IsBoundFunction(GateRef obj);
922     GateRef IsJSOrBoundFunction(GateRef obj);
923     GateRef GetMethodFromJSFunctionOrProxy(GateRef jsfunc);
924     GateRef IsNativeMethod(GateRef method);
925     GateRef GetFuncKind(GateRef method);
926     GateRef HasPrototype(GateRef kind);
927     GateRef HasAccessor(GateRef kind);
928     GateRef IsClassConstructorKind(GateRef kind);
929     GateRef IsGeneratorKind(GateRef kind);
930     GateRef IsBaseKind(GateRef kind);
931     GateRef IsBaseConstructorKind(GateRef kind);
932     GateRef IsSendableFunction(GateRef method);
933 
934     GateRef IsAOTLiteralInfo(GateRef info);
935     GateRef GetIhcFromAOTLiteralInfo(GateRef info);
936     GateRef IsAotWithCallField(GateRef method);
937     GateRef IsFastCall(GateRef method);
938     GateRef JudgeAotAndFastCall(GateRef jsFunc, CircuitBuilder::JudgeMethodType type);
939     GateRef GetInternalString(GateRef glue, GateRef key);
940     GateRef GetExpectedNumOfArgs(GateRef method);
941     GateRef GetMethod(GateRef glue, GateRef obj, GateRef key, GateRef profileTypeInfo, GateRef slotId);
942     // proxy operator
943     GateRef GetMethodFromJSProxy(GateRef proxy);
944     GateRef GetHandlerFromJSProxy(GateRef proxy);
945     GateRef GetTargetFromJSProxy(GateRef proxy);
946     inline void SetHotnessCounter(GateRef glue, GateRef method, GateRef value);
947     inline void SaveHotnessCounterIfNeeded(GateRef glue, GateRef sp, GateRef hotnessCounter, JSCallMode mode);
948     inline void SavePcIfNeeded(GateRef glue);
949     inline void SaveJumpSizeIfNeeded(GateRef glue, GateRef jumpSize);
950     inline GateRef ComputeTaggedArraySize(GateRef length);
951     inline GateRef GetGlobalConstantValue(
952         VariableType type, GateRef glue, ConstantIndex index);
953     inline GateRef GetSingleCharTable(GateRef glue);
954     inline GateRef IsEnableElementsKind(GateRef glue);
955     inline GateRef GetGlobalEnvValue(VariableType type, GateRef env, size_t index);
956     GateRef CallGetterHelper(GateRef glue, GateRef receiver, GateRef holder,
957                              GateRef accessor, ProfileOperation callback, GateRef hir = Circuit::NullGate());
958     GateRef ConstructorCheck(GateRef glue, GateRef ctor, GateRef outPut, GateRef thisObj);
959     GateRef GetCallSpreadArgs(GateRef glue, GateRef array, ProfileOperation callBack);
960     GateRef GetIterator(GateRef glue, GateRef obj, ProfileOperation callback);
961     // For BaselineJIT
962     GateRef FastToBooleanBaseline(GateRef value, bool flag = true);
963     GateRef GetBaselineCodeAddr(GateRef baselineCode);
964 
965     GateRef IsFastTypeArray(GateRef jsType);
966     GateRef GetTypeArrayPropertyByName(GateRef glue, GateRef receiver, GateRef holder, GateRef key, GateRef jsType);
967     GateRef SetTypeArrayPropertyByName(GateRef glue, GateRef receiver, GateRef holder, GateRef key, GateRef value,
968                                        GateRef jsType);
969     GateRef TryStringOrSymbolToElementIndex(GateRef glue, GateRef key);
970     inline GateRef DispatchBuiltins(GateRef glue, GateRef builtinsId, const std::vector<GateRef>& args);
971     inline GateRef DispatchBuiltinsWithArgv(GateRef glue, GateRef builtinsId, const std::vector<GateRef>& args);
972     GateRef ComputeSizeUtf8(GateRef length);
973     GateRef ComputeSizeUtf16(GateRef length);
974     GateRef AlignUp(GateRef x, GateRef alignment);
975     inline void SetLength(GateRef glue, GateRef str, GateRef length, bool compressed);
976     inline void SetLength(GateRef glue, GateRef str, GateRef length, GateRef isCompressed);
977     void Assert(int messageId, int line, GateRef glue, GateRef condition, Label *nextLabel);
978 
979     GateRef GetNormalStringData(const StringInfoGateRef &stringInfoGate);
980 
981     void Comment(GateRef glue, const std::string &str);
982     GateRef ToNumber(GateRef glue, GateRef tagged);
983     inline GateRef LoadPfHeaderFromConstPool(GateRef jsFunc);
984     GateRef RemoveTaggedWeakTag(GateRef weak);
985     inline GateRef LoadHCIndexFromConstPool(GateRef cachedArray, GateRef cachedLength, GateRef traceId, Label *miss);
986     inline GateRef LoadHCIndexInfosFromConstPool(GateRef jsFunc);
987     inline GateRef GetAttrIndex(GateRef index);
988     inline GateRef GetAttr(GateRef layoutInfo, GateRef index);
989     inline GateRef GetKey(GateRef layoutInfo, GateRef index);
990     inline GateRef GetKeyIndex(GateRef index);
991     GateRef CalArrayRelativePos(GateRef index, GateRef arrayLen);
992     GateRef AppendSkipHole(GateRef glue, GateRef first, GateRef second, GateRef copyLength);
993     GateRef IntToEcmaString(GateRef glue, GateRef number);
994     GateRef ToCharCode(GateRef number);
995     GateRef NumberToString(GateRef glue, GateRef number);
996     inline GateRef GetViewedArrayBuffer(GateRef dataView);
997     inline GateRef GetByteOffset(GateRef dataView);
998     inline GateRef GetByteLength(GateRef dataView);
999     inline GateRef GetArrayBufferData(GateRef buffer);
1000     inline GateRef GetArrayBufferByteLength(GateRef buffer);
1001     inline void SetArrayBufferByteLength(GateRef glue, GateRef buffer, GateRef length);
1002     GateRef IsDetachedBuffer(GateRef buffer);
1003     inline GateRef IsMarkerCellValid(GateRef cell);
1004     inline GateRef GetAccessorHasChanged(GateRef obj);
1005     inline GateRef ComputeTaggedTypedArraySize(GateRef elementSize, GateRef length);
1006     GateRef ChangeTaggedPointerToInt64(GateRef x);
1007     GateRef GetLastLeaveFrame(GateRef glue);
1008     inline GateRef GetPropertiesCache(GateRef glue);
1009     GateRef GetIndexFromPropertiesCache(GateRef glue, GateRef cache, GateRef cls, GateRef key,
1010                                         GateRef hir = Circuit::NullGate());
1011     inline void SetToPropertiesCache(GateRef glue, GateRef cache, GateRef cls, GateRef key, GateRef result,
1012                                      GateRef hir = Circuit::NullGate());
1013     GateRef HashFromHclassAndKey(GateRef glue, GateRef cls, GateRef key, GateRef hir = Circuit::NullGate());
1014     GateRef GetKeyHashCode(GateRef glue, GateRef key, GateRef hir = Circuit::NullGate());
1015     inline GateRef GetSortedKey(GateRef layoutInfo, GateRef index);
1016     inline GateRef GetSortedIndex(GateRef layoutInfo, GateRef index);
1017     inline GateRef GetSortedIndex(GateRef attr);
1018     inline void StoreWithoutBarrier(VariableType type, GateRef base, GateRef offset, GateRef value);
1019     GateRef DefineFunc(GateRef glue, GateRef constpool, GateRef index,
1020                        FunctionKind targetKind = FunctionKind::LAST_FUNCTION_KIND);
1021     GateRef BinarySearch(GateRef glue, GateRef layoutInfo, GateRef key, GateRef propsNum,
1022                          GateRef hir = Circuit::NullGate());
1023     void UpdateProfileTypeInfoCellToFunction(GateRef glue, GateRef function,
1024                                              GateRef profileTypeInfo, GateRef slotId);
1025     GateRef Loadlocalmodulevar(GateRef glue, GateRef index, GateRef module);
1026     GateRef GetArgumentsElements(GateRef glue, GateRef argvTaggedArray, GateRef argv);
1027     void TryToJitReuseCompiledFunc(GateRef glue, GateRef jsFunc, GateRef profileTypeInfoCell);
1028     GateRef GetIsFastCall(GateRef machineCode);
1029 
1030     enum OverlapKind {
1031         // NotOverlap means the source and destination memory are not overlap,
1032         // or overlap but the start of source is larger than destination.
1033         // then we will copy the memory from left to right.
1034         NotOverlap,
1035         // MustOverlap mean the source and destination memory are overlap,
1036         // and the start of source is lesser than destination.
1037         // then we will copy the memory from right to left.
1038         MustOverlap,
1039         // Unknown means all the kinds above are possible, it will select the suitable one in runtime.
1040         Unknown,
1041     };
1042     template <OverlapKind kind>
1043     void ArrayCopy(GateRef glue, GateRef src, GateRef dst, GateRef length,
1044                    MemoryAttribute mAttr = MemoryAttribute::Default());
1045 protected:
1046     static constexpr int LOOP_UNROLL_FACTOR = 2;
1047 private:
1048     using BinaryOperation = std::function<GateRef(Environment*, GateRef, GateRef)>;
1049     template<OpCode Op>
1050     GateRef FastAddSubAndMul(GateRef glue, GateRef left, GateRef right, ProfileOperation callback);
1051     GateRef FastIntDiv(GateRef left, GateRef right, Label *bailout, ProfileOperation callback);
1052     template<OpCode Op>
1053     GateRef FastBinaryOp(GateRef glue, GateRef left, GateRef right,
1054                          const BinaryOperation& intOp, const BinaryOperation& floatOp, ProfileOperation callback);
1055     GateRef TryStringAdd(Environment *env, GateRef glue, GateRef left, GateRef right,
1056                          const BinaryOperation& intOp, const BinaryOperation& floatOp, ProfileOperation callback);
1057     GateRef NumberOperation(Environment *env, GateRef left, GateRef right,
1058                             const BinaryOperation& intOp,
1059                             const BinaryOperation& floatOp,
1060                             ProfileOperation callback);
1061     void SetSValueWithBarrier(GateRef glue, GateRef obj, GateRef offset, GateRef value, GateRef objectRegion,
1062                                       GateRef valueRegion);
1063 
1064     void SetNonSValueWithBarrier(GateRef glue, GateRef obj, GateRef offset, GateRef value, GateRef objectRegion,
1065                                      GateRef valueRegion, bool withEden);
1066     void InitializeArguments();
1067     void CheckDetectorName(GateRef glue, GateRef key, Label *fallthrough, Label *slow);
1068     GateRef CanDoubleRepresentInt(GateRef exp, GateRef expBits, GateRef fractionBits);
1069     GateRef CalIteratorKey(GateRef glue);
1070 
1071     CallSignature *callSignature_ {nullptr};
1072     Environment *env_;
1073 };
1074 }  // namespace panda::ecmascript::kungfu
1075 #endif  // ECMASCRIPT_COMPILER_STUB_BUILDER_H
1076