Lines Matching refs:builder_

35     builder_.Bind(&SuccessLabel);                                 \
37 successControl.SetState(builder_.GetState()); \
38 successControl.SetDepend(builder_.GetDepend()); \
40 builder_.Bind(&FailLabel); \
42 failControl.SetState(builder_.GetState()); \
43 failControl.SetDepend(builder_.GetDepend()); \
60 Environment env(gate, circuit_, &builder_);
122 GateRef envOffset = builder_.IntPtr(JSFunction::LEXICAL_ENV_OFFSET);
123 GateRef env = builder_.Load(VariableType::JS_ANY(), jsFunc, envOffset, acc_.GetDep(gate));
144 Label exit(&builder_);
145 DEFVALUE(res, (&builder_), VariableType::JS_ANY(), builder_.Undefined());
149 builder_.Bind(&exit);
150 GateRef stateInGate = builder_.GetState();
151 GateRef depend = builder_.GetDepend();
158 auto condition = builder_.HasPendingException(glue_);
159 GateRef ifBranch = builder_.Branch(state, condition, 1, BranchWeight::DEOPT_WEIGHT, "checkException");
160 GateRef ifTrue = builder_.IfTrue(ifBranch);
161 GateRef ifFalse = builder_.IfFalse(ifBranch);
162 GateRef eDepend = builder_.DependRelay(ifTrue, depend);
163 GateRef sDepend = builder_.DependRelay(ifFalse, depend);
186 GateRef state = builder_.GetState();
188 GateRef depend = builder_.GetDepend();
190 GateRef exceptionVal = builder_.ExceptionConstant();
192 GateRef equal = builder_.Equal(value, exceptionVal);
193 auto ifBranch = builder_.Branch(state, equal, 1, BranchWeight::DEOPT_WEIGHT, "checkException");
195 GateRef ifTrue = builder_.IfTrue(ifBranch);
196 GateRef ifFalse = builder_.IfFalse(ifBranch);
197 GateRef eDepend = builder_.DependRelay(ifTrue, depend);
198 GateRef sDepend = builder_.DependRelay(ifFalse, depend);
203 acc_.ReplaceHirDirectly(hirGate, builder_.GetStateDepend(), value);
215 auto condition = builder_.HasPendingException(glue_);
216 GateRef state = builder_.GetState();
217 GateRef depend = builder_.GetDepend();
218 GateRef ifBranch = builder_.Branch(state, condition, BranchWeight::DEOPT_WEIGHT, 1, "checkException");
219 GateRef ifTrue = builder_.IfTrue(ifBranch);
220 GateRef ifFalse = builder_.IfFalse(ifBranch);
221 GateRef eDepend = builder_.DependRelay(ifTrue, depend);
222 GateRef sDepend = builder_.DependRelay(ifFalse, depend);
233 Environment env(gate, circuit_, &builder_);
813 GateRef slotId = builder_.ZExtInt16ToInt32(acc_.GetValueIn(gate, 0));
817 GateRef result = builder_.CallStub(glue_, gate, sign, inputs);
825 GateRef result = builder_.CallRuntime(glue_, index, Gate::InvalidGateRef, args, gate, name.c_str());
829 GateRef target = builder_.IntPtr(index);
830 GateRef result = builder_.Call(cs, glue_, target, builder_.GetDepend(), args, gate, name.c_str());
839 GateRef result = builder_.CallNGCRuntime(glue_, index, Gate::InvalidGateRef, args, gate, name.c_str());
843 GateRef target = builder_.IntPtr(index);
844 GateRef result = builder_.Call(cs, glue_, target, builder_.GetDepend(), args, gate, name.c_str());
853 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Add,
879 builder_.SetDepend(acc_.GetDep(saveRegister));
881 builder_.Load(VariableType::JS_POINTER(), genObj, builder_.IntPtr(JSGeneratorObject::GENERATOR_CONTEXT_OFFSET));
885 GateRef length = builder_.Int32(arrLength);
886 GateRef taggedLength = builder_.ToTaggedInt(builder_.ZExtInt32ToInt64(length));
890 auto hole = builder_.HoleConstant();
895 builder_.SetValueToTaggedArray(VariableType::JS_ANY(), glue_, taggedArray, builder_.Int32(idx), tmpGate);
903 GateRef regsArrayOffset = builder_.IntPtr(GeneratorContext::GENERATOR_REGS_ARRAY_OFFSET);
904 builder_.Store(VariableType::JS_POINTER(), glue_, context, regsArrayOffset, taggedArray);
907 GateRef thisOffset = builder_.IntPtr(GeneratorContext::GENERATOR_THIS_OFFSET);
909 builder_.Store(VariableType::JS_ANY(), glue_, context, thisOffset, thisObj);
912 GateRef methodOffset = builder_.IntPtr(GeneratorContext::GENERATOR_METHOD_OFFSET);
914 builder_.Store(VariableType::JS_ANY(), glue_, context, methodOffset, jsFunc);
918 GateRef accOffset = builder_.IntPtr(GeneratorContext::GENERATOR_ACC_OFFSET);
920 builder_.Store(VariableType::JS_ANY(), glue_, context, accOffset, curAccGate);
923 GateRef generatorObjectOffset = builder_.IntPtr(GeneratorContext::GENERATOR_GENERATOR_OBJECT_OFFSET);
924 builder_.Store(VariableType::JS_ANY(), glue_, context, generatorObjectOffset, genObj);
927 GateRef lexicalEnvOffset = builder_.IntPtr(GeneratorContext::GENERATOR_LEXICALENV_OFFSET);
928 builder_.Store(VariableType::JS_ANY(), glue_, context, lexicalEnvOffset, lexicalEnvGate);
931 GateRef nregsOffset = builder_.IntPtr(GeneratorContext::GENERATOR_NREGS_OFFSET);
932 builder_.Store(VariableType::INT32(), glue_, context, nregsOffset, length);
935 GateRef bcSizeOffset = builder_.IntPtr(GeneratorContext::GENERATOR_BC_OFFSET_OFFSET);
937 bcSizeGate = builder_.TruncInt64ToInt32(bcSizeGate);
938 builder_.Store(VariableType::INT32(), glue_, context, bcSizeOffset, bcSizeGate);
941 GateRef contextOffset = builder_.IntPtr(JSGeneratorObject::GENERATOR_CONTEXT_OFFSET);
942 builder_.Store(VariableType::JS_POINTER(), glue_, genObj, contextOffset, context);
945 builder_.Store(VariableType::JS_POINTER(), glue_, context, generatorObjectOffset, genObj);
951 acc_.SetDep(gate, builder_.GetDepend());
974 GateRef taggedTrue = builder_.TaggedTrue();
984 GateRef taggedFalse = builder_.TaggedFalse();
1023 GateRef actualArgc = builder_.Int64(BytecodeCallArgc::ComputeCallArgc(acc_.GetNumValueIn(gate),
1025 GateRef actualArgv = builder_.IntPtr(0);
1026 GateRef newTarget = builder_.Undefined();
1027 GateRef thisObj = builder_.Undefined();
1038 GateRef actualArgc = builder_.Int64(BytecodeCallArgc::ComputeCallArgc(acc_.GetNumValueIn(gate),
1040 GateRef actualArgv = builder_.IntPtr(0);
1044 GateRef newTarget = builder_.Undefined();
1064 GateRef actualArgc = builder_.Int64(BytecodeCallArgc::ComputeCallArgc(acc_.GetNumValueIn(gate),
1066 GateRef actualArgv = builder_.IntPtr(0);
1070 GateRef newTarget = builder_.Undefined();
1090 GateRef stateInGate = builder_.GetState();
1099 GateRef actualArgc = builder_.Int64(BytecodeCallArgc::ComputeCallArgc(acc_.GetNumValueIn(gate),
1101 GateRef actualArgv = builder_.IntPtr(0);
1105 GateRef newTarget = builder_.Undefined();
1106 GateRef thisObj = builder_.Undefined();
1131 GateRef exceptionOffset = builder_.Int64(JSThread::GlueData::GetExceptionOffset(false));
1132 builder_.Store(VariableType::INT64(), glue_, glue_, exceptionOffset, exception);
1134 GateRef result = builder_.GetDepend();
1166 Label successExit(&builder_);
1167 Label exceptionExit(&builder_);
1168 Label isEcmaObject(&builder_);
1169 Label notEcmaObject(&builder_);
1170 Label isHeapObject(&builder_);
1171 BRANCH_CIR(builder_.TaggedIsHeapObject(value), &isHeapObject, &notEcmaObject);
1172 builder_.Bind(&isHeapObject);
1173 BRANCH_CIR(builder_.TaggedObjectIsEcmaObject(value), &isEcmaObject, &notEcmaObject);
1174 builder_.Bind(&isEcmaObject);
1176 builder_.Jump(&successExit);
1178 builder_.Bind(&notEcmaObject);
1181 builder_.Jump(&exceptionExit);
1193 Label successExit(&builder_);
1194 Label exceptionExit(&builder_);
1195 Label isHole(&builder_);
1196 Label notHole(&builder_);
1197 BRANCH_CIR(builder_.TaggedIsHole(hole), &isHole, &notHole);
1198 builder_.Bind(&notHole);
1200 builder_.Jump(&successExit);
1202 builder_.Bind(&isHole);
1205 builder_.Jump(&exceptionExit);
1218 Label successExit(&builder_);
1219 Label exceptionExit(&builder_);
1220 Label isHole(&builder_);
1221 Label notHole(&builder_);
1222 BRANCH_CIR(builder_.TaggedIsHole(hole), &isHole, &notHole);
1223 builder_.Bind(&notHole);
1225 builder_.Jump(&successExit);
1227 builder_.Bind(&isHole);
1229 GateRef module = builder_.GetModuleFromFunction(jsFunc);
1230 GateRef obj = builder_.GetObjectFromConstPool(glue_, gate, sharedConstPool, Circuit::NullGate(), module,
1231 builder_.ZExtInt16ToInt32(acc_.GetValueIn(gate, 0)),
1234 builder_.Jump(&exceptionExit);
1245 {builder_.ToTaggedInt(acc_.GetValueIn(gate, 0)), acc_.GetValueIn(gate, 1)}, true);
1259 GateRef exceptionOffset = builder_.Int64(JSThread::GlueData::GetExceptionOffset(false));
1260 GateRef val = builder_.Int64Add(glue_, exceptionOffset);
1265 GateRef holeCst = builder_.HoleConstant();
1288 GateRef offset = builder_.Int64(JSThread::GlueData::GetGlobalObjOffset(false));
1289 GateRef val = builder_.Int64Add(glue_, offset);
1292 { builder_.GetDepend(), val }, VariableType::JS_ANY().GetGateType());
1300 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Sub,
1309 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Mul,
1318 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Div,
1327 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Mod,
1336 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Equal,
1345 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::NotEqual,
1354 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Less,
1363 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::LessEq,
1372 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Greater,
1381 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::GreaterEq,
1391 GateRef newGate = builder_.CallStub(glue_, gate, CommonStubCSigns::Getpropiterator, {glue_, object});
1408 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Inc,
1417 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Dec,
1426 Label notNumber(&builder_);
1427 Label checkResult(&builder_);
1429 DEFVALUE(result, (&builder_), VariableType::JS_ANY(), value);
1430 BRANCH_CIR(builder_.TaggedIsNumber(value), &checkResult, &notNumber);
1431 builder_.Bind(&notNumber);
1434 builder_.Jump(&checkResult);
1436 builder_.Bind(&checkResult);
1444 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Neg,
1453 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Not,
1462 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Shl,
1471 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Shr,
1480 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Ashr,
1489 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::And,
1498 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Or,
1507 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Xor,
1516 Label successExit(&builder_);
1517 Label exceptionExit(&builder_);
1518 GateRef newGate = builder_.CallStub(glue_, gate, CommonStubCSigns::DeleteObjectProperty,
1520 BRANCH_CIR(builder_.IsSpecial(newGate, JSTaggedValue::VALUE_EXCEPTION),
1559 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::StrictNotEqual,
1568 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::StrictEqual,
1575 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::CreateEmptyArray, { glue_ });
1589 GateRef index = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0));
1590 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::CreateArrayWithBuffer, { glue_, index, jsFunc });
1601 GateRef gConstAddr = builder_.Load(VariableType::JS_POINTER(), glue_,
1602 builder_.IntPtr(JSThread::GlueData::GetGlobalConstOffset(false)));
1603 GateRef constantIndex = builder_.IntPtr(JSTaggedValue::TaggedTypeSize() * hclassIndex);
1604 GateRef hclass = builder_.Load(VariableType::JS_POINTER(), gConstAddr, constantIndex);
1605 builder_.Store(VariableType::JS_POINTER(), glue_, array, builder_.IntPtr(0), hclass);
1618 GateRef module = builder_.GetModuleFromFunction(jsFunc);
1619 GateRef obj = builder_.GetObjectFromConstPool(glue_, gate, sharedConstPool, unsharedConstPool, module,
1620 builder_.TruncInt64ToInt32(index), ConstPoolType::OBJECT_LITERAL);
1631 GateRef index = builder_.ToTaggedInt(acc_.GetValueIn(gate, 0));
1642 GateRef index = builder_.ToTaggedInt(acc_.GetValueIn(gate, 0));
1675 GateRef stringId = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0));
1676 GateRef module = builder_.GetModuleFromFunction(jsFunc);
1677 GateRef numberBigInt = builder_.GetObjectFromConstPool(glue_, gate, sharedConstPool, Circuit::NullGate(), module,
1687 Label notNumber(&builder_);
1688 Label checkResult(&builder_);
1690 DEFVALUE(result, (&builder_), VariableType::JS_ANY(), value);
1691 BRANCH_CIR(builder_.TaggedIsNumeric(value), &checkResult, &notNumber);
1692 builder_.Bind(&notNumber);
1695 builder_.Jump(&checkResult);
1697 builder_.Bind(&checkResult);
1716 GateRef index = builder_.ToTaggedInt(acc_.GetValueIn(gate, 0));
1725 GateRef index = builder_.ToTaggedInt(acc_.GetValueIn(gate, 0));
1735 GateRef index = builder_.ToTaggedInt(acc_.GetValueIn(gate, 0));
1743 GateRef taggedArray = objBuilder.NewTaggedArray(glue_, builder_.Int32(length));
1745 builder_.SetValueToTaggedArray(VariableType::JS_ANY(), glue_, taggedArray,
1746 builder_.Int32(i), acc_.GetValueIn(gate, i));
1753 Environment env(gate, circuit_, &builder_);
1755 DEFVALUE(result, (&builder_), VariableType::JS_ANY(), builder_.Undefined());
1756 DEFVALUE(thisObj, (&builder_), VariableType::JS_ANY(), builder_.Undefined());
1757 DEFVALUE(newTarget, (&builder_), VariableType::JS_ANY(), argAcc_.GetFrameArgsIn(gate, FrameArgIdx::NEW_TARGET));
1758 Label fastPath(&builder_);
1759 Label slowPath(&builder_);
1760 Label callExit(&builder_);
1761 Label replaceGate(&builder_);
1763 GateRef taggedLength = builder_.ToTaggedInt(builder_.Int64(length));
1769 builder_.Bind(&fastPath);
1772 builder_.Int64(length)}, false, result, callExit); // false: not spread
1773 builder_.Bind(&callExit);
1775 builder_.Jump(&replaceGate);
1777 builder_.Bind(&slowPath);
1780 builder_.Jump(&replaceGate);
1782 builder_.Bind(&replaceGate);
1783 ReplaceHirWithPendingException(gate, builder_.GetState(), builder_.GetDepend(), *result);
1788 Environment env(gate, circuit_, &builder_);
1794 GateRef taggedLength = builder_.ToTaggedInt(builder_.Int64(funcIndex));
1804 Environment env(gate, circuit_, &builder_);
1806 DEFVALUE(result, (&builder_), VariableType::JS_ANY(), builder_.Undefined());
1807 DEFVALUE(thisObj, (&builder_), VariableType::JS_ANY(), builder_.Undefined());
1808 DEFVALUE(newTarget, (&builder_), VariableType::JS_ANY(), argAcc_.GetFrameArgsIn(gate, FrameArgIdx::NEW_TARGET));
1809 Label fastPath(&builder_);
1810 Label slowPath(&builder_);
1811 Label callExit(&builder_);
1812 Label replaceGate(&builder_);
1818 builder_.Bind(&fastPath);
1820 GateRef actualArgc = builder_.ZExtInt32ToInt64(
1821 builder_.Load(VariableType::INT32(), array, builder_.IntPtr(JSArray::LENGTH_OFFSET)));
1824 builder_.Bind(&callExit);
1826 builder_.Jump(&replaceGate);
1828 builder_.Bind(&slowPath);
1831 builder_.Jump(&replaceGate);
1833 builder_.Bind(&replaceGate);
1834 ReplaceHirWithPendingException(gate, builder_.GetState(), builder_.GetDepend(), *result);
1839 return builder_.JudgeAotAndFastCall(func, type);
1849 srcElements = builder_.CallStub(glue_, gate, CommonStubCSigns::GetCallSpreadArgs, {glue_, array});
1853 GateRef elementsPtr = builder_.GetDataOfTaggedArray(srcElements);
1860 Label fastCall(&builder_);
1861 Label notFastCall(&builder_);
1862 Label aotCall(&builder_);
1863 Label notAotCall(&builder_);
1871 GateRef method = builder_.GetMethodFromFunction(superFunc);
1872 GateRef expectedNum = builder_.GetExpectedNumOfArgs(method);
1874 builder_.Bind(&fastCall);
1876 Label notBridge(&builder_);
1877 Label bridge(&builder_);
1878 BRANCH_CIR(builder_.Int64Equal(expectedNum, actualArgc), &notBridge, &bridge);
1879 builder_.Bind(&notBridge);
1882 builder_.Jump(&exit);
1883 builder_.Bind(&bridge);
1886 builder_.Jump(&exit);
1888 builder_.Bind(&notFastCall);
1890 builder_.Bind(&aotCall);
1892 Label notBridge(&builder_);
1893 Label bridge(&builder_);
1895 BRANCH_CIR(builder_.Int64Equal(expectedNum, actualArgc), &notBridge, &bridge);
1896 builder_.Bind(&notBridge);
1898 builder_.Jump(&exit);
1899 builder_.Bind(&bridge);
1901 builder_.Jump(&exit);
1903 builder_.Bind(&notAotCall);
1906 builder_.Jump(&exit);
1912 builder_.StartCallTimer(glue_, gate, {glue_, func, builder_.True()}, true);
1914 builder_.EndCallTimer(glue_, gate, {glue_, func}, true);
1920 Label isHeapObj(&builder_);
1921 Label isJsFunc(&builder_);
1922 Label isCtor(&builder_);
1923 Label targetUndefined(&builder_);
1924 Label normalPath(&builder_);
1925 Label needAllocateThis(&builder_);
1927 BRANCH_CIR(builder_.TaggedIsHeapObject(super), &isHeapObj, &slowPath);
1928 builder_.Bind(&isHeapObj);
1929 BRANCH_CIR(builder_.IsJSFunction(super), &isJsFunc, &slowPath);
1930 builder_.Bind(&isJsFunc);
1931 BRANCH_CIR(builder_.IsConstructor(super), &isCtor, &slowPath);
1932 builder_.Bind(&isCtor);
1933 BRANCH_CIR(builder_.TaggedIsUndefined(*newTarget), &targetUndefined, &normalPath);
1934 builder_.Bind(&targetUndefined);
1936 builder_.Jump(&normalPath);
1937 builder_.Bind(&normalPath);
1938 BRANCH_CIR(builder_.IsBase(super), &needAllocateThis, &fastPath);
1939 builder_.Bind(&needAllocateThis);
1941 builder_.Jump(&fastPath);
1946 Environment env(gate, circuit_, &builder_);
1948 DEFVALUE(newTarget, (&builder_), VariableType::JS_ANY(), argAcc_.GetFrameArgsIn(gate, FrameArgIdx::NEW_TARGET));
1949 DEFVALUE(result, (&builder_), VariableType::JS_ANY(), builder_.Undefined());
1950 DEFVALUE(thisObj, (&builder_), VariableType::JS_ANY(), builder_.Undefined());
1955 Label fastPath(&builder_);
1956 Label fastPathWithArgv(&builder_);
1957 Label callExit(&builder_);
1958 Label slowPath(&builder_);
1959 Label threadCheck(&builder_);
1960 Label argvIsNull(&builder_);
1961 Label getArgsFromArgAcc(&builder_);
1964 builder_.Bind(&fastPath);
1966 BRANCH_CIR(builder_.Equal(actualArgv, builder_.IntPtr(0)), &argvIsNull, &fastPathWithArgv);
1967 builder_.Bind(&argvIsNull);
1969 GateRef method = builder_.GetMethodFromFunction(func);
1970 GateRef expectedFuncArgNum = builder_.ZExtInt32ToInt64(builder_.GetExpectedNumOfArgs(method));
1971 GateRef expected = builder_.Int64Add(expectedFuncArgNum, builder_.Int64(NUM_MANDATORY_JSFUNC_ARGS));
1972 BRANCH_CIR(builder_.Int64Equal(expected, actualArgc), &getArgsFromArgAcc, &slowPath);
1973 builder_.Bind(&getArgsFromArgAcc);
1977 builder_.Bind(&fastPathWithArgv);
1979 GateRef argc = builder_.Int64Sub(actualArgc, builder_.Int64(NUM_MANDATORY_JSFUNC_ARGS));
1980 GateRef argv = builder_.PtrAdd(actualArgv, builder_.IntPtr(NUM_MANDATORY_JSFUNC_ARGS * 8)); // 8: ptr size
1982 builder_.Bind(&callExit);
1984 builder_.Jump(&threadCheck);
1987 builder_.Bind(&slowPath);
1989 std::vector<GateRef> args { super, *newTarget, builder_.ToTaggedInt(actualArgc) };
1991 builder_.Jump(&threadCheck);
1993 builder_.Bind(&threadCheck);
1994 ReplaceHirWithPendingException(gate, builder_.GetState(), builder_.GetDepend(), *result);
2007 Label afterCallSuper(&builder_);
2008 std::vector<GateRef> callArgs { glue_, actualArgc, builder_.IntPtr(0), super, newTarget, thisObj };
2021 builder_.Bind(&afterCallSuper);
2022 result = builder_.CallStub(glue_, gate, CommonStubCSigns::ConstructorCheck, { glue_, super, *result, thisObj });
2023 builder_.Jump(&exit);
2028 Label slowpath(&builder_);
2029 Label isTrue(&builder_);
2030 Label isFalse(&builder_);
2031 Label successExit(&builder_);
2035 DEFVALUE(result, (&builder_), VariableType::JS_ANY(), value);
2037 result = builder_.CallStub(glue_, gate, CommonStubCSigns::ToBooleanTrue, { glue_, value });
2039 result = builder_.CallStub(glue_, gate, CommonStubCSigns::ToBooleanFalse, { glue_, value });
2046 Label fastPath(&builder_);
2047 Label slowPath(&builder_);
2048 Label threadCheck(&builder_);
2049 Label successExit(&builder_);
2050 Label exit(&builder_);
2052 DEFVALUE(result, (&builder_), VariableType::JS_ANY(), builder_.Undefined());
2055 GateRef thisObj = builder_.CallStub(glue_, gate, CommonStubCSigns::NewThisObjectChecked, { glue_, ctor });
2056 BRANCH_CIR(builder_.TaggedIsHole(thisObj), &slowPath, &fastPath);
2057 builder_.Bind(&fastPath);
2059 GateRef actualArgc = builder_.Int64(BytecodeCallArgc::ComputeCallArgc(acc_.GetNumValueIn(gate),
2061 GateRef actualArgv = builder_.IntPtr(0);
2070 builder_.Bind(&exit);
2071 result = builder_.CallStub(glue_, gate, CommonStubCSigns::ConstructorCheck, { glue_, ctor, *result, thisObj });
2072 builder_.Jump(&threadCheck);
2074 builder_.Bind(&slowPath);
2082 builder_.Jump(&threadCheck);
2084 builder_.Bind(&threadCheck);
2085 ReplaceHirWithPendingException(gate, builder_.GetState(), builder_.GetDepend(), *result);
2098 Label isZero(&builder_);
2099 Label notZero(&builder_);
2101 Label notFalse(&builder_);
2102 BRANCH_CIR(builder_.IsSpecial(value, JSTaggedValue::VALUE_FALSE), &isZero, &notFalse);
2103 builder_.Bind(&notFalse);
2106 Label isInt(&builder_);
2107 Label notIntZero(&builder_);
2108 BRANCH_CIR(builder_.TaggedIsInt(value), &isInt, &notIntZero);
2109 builder_.Bind(&isInt);
2110 BRANCH_CIR(builder_.Equal(builder_.TaggedGetInt(value), builder_.Int32(0)), &isZero, &notIntZero);
2111 builder_.Bind(&notIntZero);
2114 Label isDouble(&builder_);
2115 BRANCH_CIR(builder_.TaggedIsDouble(value), &isDouble, &notZero);
2116 builder_.Bind(&isDouble);
2117 BRANCH_CIR(builder_.Equal(builder_.GetDoubleOfTDouble(value), builder_.Double(0.0)), &isZero, &notZero);
2118 builder_.Bind(&notZero);
2121 builder_.Bind(&isZero);
2150 DEFVALUE(result, (&builder_), VariableType::JS_ANY(), builder_.Undefined());
2152 Label notFinish(&builder_);
2153 Label notEnumCacheValid(&builder_);
2154 Label fastGetKey(&builder_);
2155 Label slowpath(&builder_);
2156 Label exit(&builder_);
2158 GateRef index = builder_.GetIndexFromForInIterator(iter);
2159 GateRef length = builder_.GetLengthFromForInIterator(iter);
2160 BRANCH_CIR(builder_.Int32GreaterThanOrEqual(index, length), &exit, &notFinish);
2161 builder_.Bind(&notFinish);
2162 GateRef keys = builder_.GetKeysFromForInIterator(iter);
2163 GateRef receiver = builder_.GetObjectFromForInIterator(iter);
2164 GateRef cachedHclass = builder_.GetCachedHclassFromForInIterator(iter);
2165 GateRef kind = builder_.GetEnumCacheKind(glue_, keys);
2166 BRANCH_CIR(builder_.IsEnumCacheValid(receiver, cachedHclass, kind), &fastGetKey, &notEnumCacheValid);
2167 builder_.Bind(&notEnumCacheValid);
2168 BRANCH_CIR(builder_.NeedCheckProperty(receiver), &slowpath, &fastGetKey);
2169 builder_.Bind(&fastGetKey);
2171 result = builder_.GetValueFromTaggedArray(keys, index);
2172 builder_.IncreaseInteratorIndex(glue_, iter, index);
2173 builder_.Jump(&exit);
2175 builder_.Bind(&slowpath);
2178 builder_.Jump(&exit);
2181 builder_.Bind(&exit);
2218 GateRef stringId = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0));
2219 GateRef module = builder_.GetModuleFromFunction(jsFunc);
2220 GateRef pattern = builder_.GetObjectFromConstPool(glue_, gate, sharedConstPool, Circuit::NullGate(), module,
2223 GateRef newGate = LowerCallRuntime(gate, id, { pattern, builder_.ToTaggedInt(flags) }, true);
2235 GateRef holeConst = builder_.HoleConstant();
2236 DEFVALUE(result, (&builder_), VariableType::JS_ANY(), holeConst);
2237 result = builder_.CallStub(glue_, gate, CommonStubCSigns::StOwnByValue,
2250 GateRef holeConst = builder_.HoleConstant();
2251 DEFVALUE(result, (&builder_), VariableType::JS_ANY(), holeConst);
2252 result = builder_.CallStub(glue_, gate, CommonStubCSigns::StOwnByIndex,
2253 { glue_, receiver, builder_.TruncInt64ToInt32(index), accValue });
2263 GateRef stringId = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0));
2264 GateRef module = builder_.GetModuleFromFunction(jsFunc);
2265 GateRef propKey = builder_.GetObjectFromConstPool(glue_, gate, sharedConstPool, Circuit::NullGate(), module,
2270 GateRef holeConst = builder_.HoleConstant();
2271 DEFVALUE(result, (&builder_), VariableType::JS_ANY(), holeConst);
2272 result = builder_.CallStub(glue_, gate, CommonStubCSigns::StOwnByName,
2282 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::NewLexicalEnv,
2283 { glue_, lexEnv, builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0)) });
2293 auto args = { builder_.ToTaggedInt(acc_.GetValueIn(gate, 0)),
2294 builder_.ToTaggedInt(acc_.GetValueIn(gate, 1)),
2304 auto args = { builder_.ToTaggedInt(acc_.GetValueIn(gate, 0)) };
2307 GateRef module = builder_.GetModuleFromFunction(jsFunc);
2308 builder_.SetSendableEnvToModule(glue_, module, result);
2315 GateRef index = builder_.Int32(LexicalEnv::PARENT_ENV_INDEX);
2316 GateRef parentEnv = builder_.GetValueFromTaggedArray(currentEnv, index);
2358 GateRef stringId = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0));
2359 GateRef module = builder_.GetModuleFromFunction(jsFunc);
2360 GateRef propKey = builder_.GetObjectFromConstPool(glue_, gate, sharedConstPool, Circuit::NullGate(), module,
2367 GateRef isConstGate = isConst ? builder_.TaggedTrue() : builder_.TaggedFalse();
2379 Label successExit(&builder_);
2380 Label exceptionExit(&builder_);
2381 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::StOwnByValueWithNameSet,
2383 BRANCH_CIR(builder_.IsSpecial(result, JSTaggedValue::VALUE_EXCEPTION),
2395 GateRef stringId = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0));
2396 GateRef module = builder_.GetModuleFromFunction(jsFunc);
2397 GateRef propKey = builder_.GetObjectFromConstPool(glue_, gate, sharedConstPool, Circuit::NullGate(), module,
2401 Label successExit(&builder_);
2402 Label exceptionExit(&builder_);
2403 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::StOwnByNameWithNameSet,
2405 BRANCH_CIR(builder_.IsSpecial(result, JSTaggedValue::VALUE_EXCEPTION),
2456 builder_.UndefineConstant(), builder_.Int32ToTaggedInt(builder_.Int32(1)) };
2465 GateRef holeConst = builder_.HoleConstant();
2466 DEFVALUE(varAcc, (&builder_), VariableType::JS_ANY(), holeConst);
2469 varAcc = builder_.CallStub(glue_, gate, CommonStubCSigns::LdObjByIndex,
2470 {glue_, receiver, builder_.TruncInt64ToInt32(index)});
2481 DEFVALUE(result, (&builder_), VariableType::JS_ANY(), builder_.HoleConstant());
2482 result = builder_.CallStub(glue_, gate, CommonStubCSigns::StObjByIndex,
2483 {glue_, receiver, builder_.TruncInt64ToInt32(index), accValue});
2529 GateRef stringId = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0));
2530 GateRef module = builder_.GetModuleFromFunction(jsFunc);
2531 GateRef prop = builder_.GetObjectFromConstPool(glue_, gate, sharedConstPool, Circuit::NullGate(), module, stringId,
2544 GateRef stringId = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0));
2545 GateRef module = builder_.GetModuleFromFunction(jsFunc);
2546 GateRef prop = builder_.GetObjectFromConstPool(glue_, gate, sharedConstPool, Circuit::NullGate(), module, stringId,
2574 acc_.SetDep(gate, builder_.GetDepend());
2606 GateRef level = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0));
2607 GateRef slot = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 1));
2608 DEFVALUE(currentEnv, (&builder_), VariableType::JS_ANY(), acc_.GetValueIn(gate, 2)); // 2: Get current lexEnv
2609 GateRef index = builder_.Int32(LexicalEnv::PARENT_ENV_INDEX);
2610 Label exit(&builder_);
2613 builder_.Jump(&exit);
2615 currentEnv = builder_.GetValueFromTaggedArray(*currentEnv, index);
2616 builder_.Jump(&exit);
2618 DEFVALUE(i, (&builder_), VariableType::INT32(), builder_.Int32(0));
2619 Label loopHead(&builder_);
2620 Label loopEnd(&builder_);
2621 BRANCH_CIR(builder_.Int32LessThan(*i, level), &loopHead, &exit);
2622 builder_.LoopBegin(&loopHead);
2623 currentEnv = builder_.GetValueFromTaggedArray(*currentEnv, index);
2624 i = builder_.Int32Add(*i, builder_.Int32(1));
2625 BRANCH_CIR(builder_.Int32LessThan(*i, level), &loopEnd, &exit);
2626 builder_.Bind(&loopEnd);
2627 builder_.LoopEnd(&loopHead);
2629 builder_.Bind(&exit);
2630 GateRef valueIndex = builder_.Int32Add(slot, builder_.Int32(LexicalEnv::RESERVED_ENV_LENGTH));
2631 GateRef result = builder_.GetValueFromTaggedArray(*currentEnv, valueIndex);
2639 GateRef level = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0));
2640 GateRef slot = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 1));
2642 GateRef module = builder_.GetModuleFromFunction(jsFunc);
2643 DEFVALUE(currentEnv, (&builder_), VariableType::JS_ANY(), builder_.GetSendableEnvFromModule(module));
2644 GateRef index = builder_.Int32(SendableEnv::SENDABLE_PARENT_ENV_INDEX);
2645 Label exit(&builder_);
2648 builder_.Jump(&exit);
2650 currentEnv = builder_.GetValueFromTaggedArray(*currentEnv, index);
2651 builder_.Jump(&exit);
2653 DEFVALUE(i, (&builder_), VariableType::INT32(), builder_.Int32(0));
2654 Label loopHead(&builder_);
2655 Label loopEnd(&builder_);
2656 BRANCH_CIR(builder_.Int32LessThan(*i, level), &loopHead, &exit);
2657 builder_.LoopBegin(&loopHead);
2658 currentEnv = builder_.GetValueFromTaggedArray(*currentEnv, index);
2659 i = builder_.Int32Add(*i, builder_.Int32(1));
2660 BRANCH_CIR(builder_.Int32LessThan(*i, level), &loopEnd, &exit);
2661 builder_.Bind(&loopEnd);
2662 builder_.LoopEnd(&loopHead);
2664 builder_.Bind(&exit);
2665 GateRef valueIndex = builder_.Int32Add(slot, builder_.Int32(SendableEnv::SENDABLE_RESERVED_ENV_LENGTH));
2666 GateRef result = builder_.GetValueFromTaggedArray(*currentEnv, valueIndex);
2674 GateRef level = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0));
2675 GateRef slot = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 1));
2677 DEFVALUE(currentEnv, (&builder_), VariableType::JS_ANY(), acc_.GetValueIn(gate, 2)); // 2: Get current lexEnv
2678 GateRef index = builder_.Int32(LexicalEnv::PARENT_ENV_INDEX);
2679 Label exit(&builder_);
2682 builder_.Jump(&exit);
2684 currentEnv = builder_.GetValueFromTaggedArray(*currentEnv, index);
2685 builder_.Jump(&exit);
2687 DEFVALUE(i, (&builder_), VariableType::INT32(), builder_.Int32(0));
2688 Label loopHead(&builder_);
2689 Label loopEnd(&builder_);
2690 BRANCH_CIR(builder_.Int32LessThan(*i, level), &loopHead, &exit);
2691 builder_.LoopBegin(&loopHead);
2692 currentEnv = builder_.GetValueFromTaggedArray(*currentEnv, index);
2693 i = builder_.Int32Add(*i, builder_.Int32(1));
2694 BRANCH_CIR(builder_.Int32LessThan(*i, level), &loopEnd, &exit);
2695 builder_.Bind(&loopEnd);
2696 builder_.LoopEnd(&loopHead);
2698 builder_.Bind(&exit);
2699 GateRef valueIndex = builder_.Int32Add(slot, builder_.Int32(LexicalEnv::RESERVED_ENV_LENGTH));
2700 builder_.SetValueToTaggedArray(VariableType::JS_ANY(), glue_, *currentEnv, valueIndex, value);
2709 GateRef level = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0));
2710 GateRef slot = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 1));
2713 GateRef module = builder_.GetModuleFromFunction(jsFunc);
2714 DEFVALUE(currentEnv, (&builder_), VariableType::JS_ANY(), builder_.GetSendableEnvFromModule(module));
2715 GateRef index = builder_.Int32(SendableEnv::SENDABLE_PARENT_ENV_INDEX);
2716 Label exit(&builder_);
2719 builder_.Jump(&exit);
2721 currentEnv = builder_.GetValueFromTaggedArray(*currentEnv, index);
2722 builder_.Jump(&exit);
2724 DEFVALUE(i, (&builder_), VariableType::INT32(), builder_.Int32(0));
2725 Label loopHead(&builder_);
2726 Label loopEnd(&builder_);
2727 BRANCH_CIR(builder_.Int32LessThan(*i, level), &loopHead, &exit);
2728 builder_.LoopBegin(&loopHead);
2729 currentEnv = builder_.GetValueFromTaggedArray(*currentEnv, index);
2730 i = builder_.Int32Add(*i, builder_.Int32(1));
2731 BRANCH_CIR(builder_.Int32LessThan(*i, level), &loopEnd, &exit);
2732 builder_.Bind(&loopEnd);
2733 builder_.LoopEnd(&loopHead);
2735 builder_.Bind(&exit);
2736 GateRef valueIndex = builder_.Int32Add(slot, builder_.Int32(SendableEnv::SENDABLE_RESERVED_ENV_LENGTH));
2737 builder_.SetValueToTaggedArray(VariableType::JS_ANY(), glue_, *currentEnv, valueIndex, value);
2752 GateRef module = builder_.GetModuleFromFunction(jsFunc);
2753 Label isException(&builder_);
2754 Label isNotException(&builder_);
2758 builder_.ToTaggedInt(methodId), builder_.ToTaggedInt(literalId), module,
2759 builder_.ToTaggedInt(length),
2762 builder_.Int32ToTaggedInt(builder_.ZExtInt16ToInt32(acc_.GetValueIn(gate, 5))), jsFunc
2766 BRANCH_CIR(builder_.IsSpecial(result, JSTaggedValue::VALUE_EXCEPTION), &isException, &isNotException);
2774 Environment env(gate, circuit_, &builder_);
2796 Label success(&builder_);
2797 Label failed(&builder_);
2798 GateRef result = builder_.CallStub(glue_, gate, CommonStubCSigns::Definefunc,
2799 {glue_, jsFunc, builder_.TruncInt64ToInt32(methodId), builder_.TruncInt64ToInt32(length), lexEnv, slotId});
2800 BRANCH_CIR(builder_.TaggedIsException(result), &failed, &success);
2819 Label entry(&builder_);
2820 Label exit(&builder_);
2822 GateRef gConstAddr = builder_.Load(VariableType::JS_POINTER(), glue_,
2823 builder_.IntPtr(JSThread::GlueData::GetGlobalConstOffset(builder_.GetCompilationConfig()->Is32Bit())));
2824 GateRef undefinedIndex = builder_.GetGlobalConstantOffset(ConstantIndex::UNDEFINED_STRING_INDEX);
2825 GateRef gConstUndefinedStr = builder_.Load(VariableType::JS_POINTER(), gConstAddr, undefinedIndex);
2826 DEFVALUE(result, (&builder_), VariableType::JS_POINTER(), gConstUndefinedStr);
2827 Label objIsTrue(&builder_);
2828 Label objNotTrue(&builder_);
2829 Label defaultLabel(&builder_);
2830 GateRef gConstBooleanStr = builder_.Load(VariableType::JS_POINTER(), gConstAddr,
2831 builder_.GetGlobalConstantOffset(ConstantIndex::BOOLEAN_STRING_INDEX));
2832 BRANCH_CIR(builder_.TaggedIsTrue(obj), &objIsTrue, &objNotTrue);
2833 builder_.Bind(&objIsTrue);
2836 builder_.Jump(&exit);
2838 builder_.Bind(&objNotTrue);
2840 Label objIsFalse(&builder_);
2841 Label objNotFalse(&builder_);
2842 BRANCH_CIR(builder_.TaggedIsFalse(obj), &objIsFalse, &objNotFalse);
2843 builder_.Bind(&objIsFalse);
2846 builder_.Jump(&exit);
2848 builder_.Bind(&objNotFalse);
2850 Label objIsNull(&builder_);
2851 Label objNotNull(&builder_);
2852 BRANCH_CIR(builder_.TaggedIsNull(obj), &objIsNull, &objNotNull);
2853 builder_.Bind(&objIsNull);
2855 result = builder_.Load(VariableType::JS_POINTER(), gConstAddr,
2856 builder_.GetGlobalConstantOffset(ConstantIndex::OBJECT_STRING_INDEX));
2857 builder_.Jump(&exit);
2859 builder_.Bind(&objNotNull);
2861 Label objIsUndefined(&builder_);
2862 Label objNotUndefined(&builder_);
2863 BRANCH_CIR(builder_.TaggedIsUndefined(obj), &objIsUndefined, &objNotUndefined);
2864 builder_.Bind(&objIsUndefined);
2866 result = builder_.Load(VariableType::JS_POINTER(), gConstAddr,
2867 builder_.GetGlobalConstantOffset(ConstantIndex::UNDEFINED_STRING_INDEX));
2868 builder_.Jump(&exit);
2870 builder_.Bind(&objNotUndefined);
2871 builder_.Jump(&defaultLabel);
2875 builder_.Bind(&defaultLabel);
2877 Label objIsHeapObject(&builder_);
2878 Label objNotHeapObject(&builder_);
2879 BRANCH_CIR(builder_.TaggedIsHeapObject(obj), &objIsHeapObject, &objNotHeapObject);
2880 builder_.Bind(&objIsHeapObject);
2882 Label objIsString(&builder_);
2883 Label objNotString(&builder_);
2884 BRANCH_CIR(builder_.TaggedObjectIsString(obj), &objIsString, &objNotString);
2885 builder_.Bind(&objIsString);
2887 result = builder_.Load(VariableType::JS_POINTER(), gConstAddr,
2888 builder_.GetGlobalConstantOffset(ConstantIndex::STRING_STRING_INDEX));
2889 builder_.Jump(&exit);
2891 builder_.Bind(&objNotString);
2893 Label objIsSymbol(&builder_);
2894 Label objNotSymbol(&builder_);
2895 BRANCH_CIR(builder_.IsJsType(obj, JSType::SYMBOL), &objIsSymbol, &objNotSymbol);
2896 builder_.Bind(&objIsSymbol);
2898 result = builder_.Load(VariableType::JS_POINTER(), gConstAddr,
2899 builder_.GetGlobalConstantOffset(ConstantIndex::SYMBOL_STRING_INDEX));
2900 builder_.Jump(&exit);
2902 builder_.Bind(&objNotSymbol);
2904 Label objIsCallable(&builder_);
2905 Label objNotCallable(&builder_);
2906 BRANCH_CIR(builder_.IsCallable(obj), &objIsCallable, &objNotCallable);
2907 builder_.Bind(&objIsCallable);
2909 result = builder_.Load(VariableType::JS_POINTER(), gConstAddr,
2910 builder_.GetGlobalConstantOffset(ConstantIndex::FUNCTION_STRING_INDEX));
2911 builder_.Jump(&exit);
2913 builder_.Bind(&objNotCallable);
2915 Label objIsBigInt(&builder_);
2916 Label objNotBigInt(&builder_);
2917 BRANCH_CIR(builder_.IsJsType(obj, JSType::BIGINT), &objIsBigInt, &objNotBigInt);
2918 builder_.Bind(&objIsBigInt);
2920 result = builder_.Load(VariableType::JS_POINTER(), gConstAddr,
2921 builder_.GetGlobalConstantOffset(ConstantIndex::BIGINT_STRING_INDEX));
2922 builder_.Jump(&exit);
2924 builder_.Bind(&objNotBigInt);
2926 result = builder_.Load(VariableType::JS_POINTER(), gConstAddr,
2927 builder_.GetGlobalConstantOffset(ConstantIndex::OBJECT_STRING_INDEX));
2928 builder_.Jump(&exit);
2934 builder_.Bind(&objNotHeapObject);
2936 Label objIsNum(&builder_);
2937 Label objNotNum(&builder_);
2938 BRANCH_CIR(builder_.TaggedIsNumber(obj), &objIsNum, &objNotNum);
2939 builder_.Bind(&objIsNum);
2941 result = builder_.Load(VariableType::JS_POINTER(), gConstAddr,
2942 builder_.GetGlobalConstantOffset(ConstantIndex::NUMBER_STRING_INDEX));
2943 builder_.Jump(&exit);
2945 builder_.Bind(&objNotNum);
2946 builder_.Jump(&exit);
2949 builder_.Bind(&exit);
2955 GateRef offset = builder_.PtrMul(builder_.ZExtInt32ToPtr(indexOffset),
2956 builder_.IntPtr(JSTaggedValue::TaggedTypeSize()));
2957 GateRef dataOffset = builder_.PtrAdd(offset, builder_.IntPtr(TaggedArray::DATA_OFFSET));
2958 GateRef value = builder_.Load(VariableType::JS_ANY(), arrayGate, dataOffset);
2966 auto indexOffset = builder_.Int32(index);
2977 GateRef contextOffset = builder_.IntPtr(JSGeneratorObject::GENERATOR_CONTEXT_OFFSET);
2978 GateRef contextGate = builder_.Load(VariableType::JS_POINTER(), obj, contextOffset);
2979 GateRef arrayOffset = builder_.IntPtr(GeneratorContext::GENERATOR_REGS_ARRAY_OFFSET);
2980 GateRef arrayGate = builder_.Load(VariableType::JS_POINTER(), contextGate, arrayOffset);
2994 Label isAsyncGeneratorObj(&builder_);
2995 Label notAsyncGeneratorObj(&builder_);
2996 Label exit(&builder_);
2997 DEFVALUE(result, (&builder_), VariableType::JS_ANY(), builder_.HoleConstant());
2998 BRANCH_CIR(builder_.TaggedIsAsyncGeneratorObject(obj), &isAsyncGeneratorObj, &notAsyncGeneratorObj);
2999 builder_.Bind(&isAsyncGeneratorObj);
3001 GateRef resumeResultOffset = builder_.IntPtr(JSAsyncGeneratorObject::GENERATOR_RESUME_RESULT_OFFSET);
3002 result = builder_.Load(VariableType::JS_ANY(), obj, resumeResultOffset);
3003 builder_.Jump(&exit);
3005 builder_.Bind(&notAsyncGeneratorObj);
3007 GateRef resumeResultOffset = builder_.IntPtr(JSGeneratorObject::GENERATOR_RESUME_RESULT_OFFSET);
3008 result = builder_.Load(VariableType::JS_ANY(), obj, resumeResultOffset);
3009 GateRef taskInfoOffset = builder_.IntPtr(JSGeneratorObject::TASK_INFO_OFFSET);
3010 GateRef taskInfo = builder_.Load(VariableType::NATIVE_POINTER(), obj, taskInfoOffset);
3012 builder_.IntPtr(JSThread::GlueData::GetTaskInfoOffset(builder_.GetCompilationConfig()->Is32Bit()));
3013 builder_.Store(VariableType::NATIVE_POINTER(), glue_, glue_, glueTaskOffset, taskInfo);
3014 builder_.Store(VariableType::NATIVE_POINTER(), glue_, obj, taskInfoOffset, builder_.IntPtr(0));
3015 builder_.Jump(&exit);
3017 builder_.Bind(&exit);
3025 DEFVALUE(result, (&builder_), VariableType::JS_ANY(), builder_.Undefined());
3026 Label isAsyncGeneratorObj(&builder_);
3027 Label notAsyncGeneratorObj(&builder_);
3028 Label exit(&builder_);
3030 BRANCH_CIR(builder_.TaggedIsAsyncGeneratorObject(obj), &isAsyncGeneratorObj, &notAsyncGeneratorObj);
3031 builder_.Bind(&isAsyncGeneratorObj);
3033 GateRef bitFieldOffset = builder_.IntPtr(JSAsyncGeneratorObject::BIT_FIELD_OFFSET);
3034 GateRef bitField = builder_.Load(VariableType::INT32(), obj, bitFieldOffset);
3035 auto bitfieldlsr = builder_.Int32LSR(bitField,
3036 builder_.Int32(JSAsyncGeneratorObject::ResumeModeBits::START_BIT));
3037 GateRef modeBits = builder_.Int32And(bitfieldlsr,
3038 builder_.Int32((1LU << JSAsyncGeneratorObject::ResumeModeBits::SIZE) - 1));
3039 auto resumeMode = builder_.SExtInt32ToInt64(modeBits);
3040 result = builder_.ToTaggedIntPtr(resumeMode);
3041 builder_.Jump(&exit);
3043 builder_.Bind(&notAsyncGeneratorObj);
3045 GateRef bitFieldOffset = builder_.IntPtr(JSGeneratorObject::BIT_FIELD_OFFSET);
3046 GateRef bitField = builder_.Load(VariableType::INT32(), obj, bitFieldOffset);
3047 auto bitfieldlsr = builder_.Int32LSR(bitField, builder_.Int32(JSGeneratorObject::ResumeModeBits::START_BIT));
3048 GateRef modeBits = builder_.Int32And(bitfieldlsr,
3049 builder_.Int32((1LU << JSGeneratorObject::ResumeModeBits::SIZE) - 1));
3050 auto resumeMode = builder_.SExtInt32ToInt64(modeBits);
3051 result = builder_.ToTaggedIntPtr(resumeMode);
3052 builder_.Jump(&exit);
3054 builder_.Bind(&exit);
3064 GateRef methodId = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0));
3065 GateRef module = builder_.GetModuleFromFunction(jsFunc);
3066 auto method = builder_.GetObjectFromConstPool(glue_, gate, sharedConstPool, Circuit::NullGate(), module, methodId,
3072 Label defaultLabel(&builder_);
3073 Label successExit(&builder_);
3074 Label exceptionExit(&builder_);
3075 auto args = {method, homeObject, builder_.ToTaggedInt(length), env, builder_.GetModuleFromFunction(jsFunc),
3077 builder_.Int32ToTaggedInt(builder_.ZExtInt16ToInt32(acc_.GetValueIn(gate, 3))), jsFunc // 3: slot id
3081 BRANCH_CIR(builder_.IsSpecial(result, JSTaggedValue::VALUE_EXCEPTION),
3090 GateRef newGate = builder_.CallStub(glue_, gate, CommonStubCSigns::GetUnmappedArgs,
3091 { glue_, builder_.IntPtr(0), builder_.TruncInt64ToInt32(actualArgc), builder_.Undefined() });
3098 GateRef taggedArgc = builder_.ToTaggedInt(actualArgc);
3100 GateRef taggedRestIdx = builder_.ToTaggedInt(restIdx);
3111 GateRef newGate = LowerCallRuntime(gate, id, {builder_.ToTaggedInt(index)});
3119 GateRef newGate = LowerCallRuntime(gate, id, {builder_.ToTaggedInt(index)});
3131 auto ecmaOpcodeGate = builder_.Int32(static_cast<uint32_t>(ecmaOpcode));
3132 GateRef constOpcode = builder_.ToTaggedInt(builder_.ZExtInt32ToInt64(ecmaOpcodeGate));
3133 GateRef slowPath = builder_.Int32ToTaggedInt(builder_.Int32(0));
3134 GateRef debugGate = builder_.CallRuntime(glue_, RTSTUB_ID(DebugAOTPrint), acc_.GetDep(gate),
3146 GateRef func = builder_.Undefined();
3150 GateRef bcIndex = builder_.Int32ToTaggedInt(builder_.Int32(acc_.TryGetBcIndex(gate)));
3151 auto ecmaOpcodeGate = builder_.Int32(static_cast<uint32_t>(ecmaOpcode));
3152 GateRef constOpcode = builder_.Int32ToTaggedInt(ecmaOpcodeGate);
3154 builder_.Int32ToTaggedInt(builder_.Int32(static_cast<int32_t>(OptCodeProfiler::Mode::SLOW_PATH)));
3155 GateRef profiling = builder_.CallRuntime(glue_, RTSTUB_ID(ProfileOptimizedCode), acc_.GetDep(gate),
3166 GateRef actualArgc = builder_.Int64(BytecodeCallArgc::ComputeCallArgc(acc_.GetNumValueIn(gate),
3168 GateRef actualArgv = builder_.IntPtr(0);
3169 GateRef newTarget = builder_.Undefined();
3179 GateRef actualArgc = builder_.Int64(BytecodeCallArgc::ComputeCallArgc(acc_.GetNumValueIn(gate),
3181 GateRef actualArgv = builder_.IntPtr(0);
3182 GateRef newTarget = builder_.Undefined();
3184 GateRef thisObj = builder_.Undefined();
3197 GateRef actualArgc = builder_.Int64(BytecodeCallArgc::ComputeCallArgc(acc_.GetNumValueIn(gate),
3199 GateRef actualArgv = builder_.IntPtr(0);
3201 GateRef newTarget = builder_.Undefined();
3202 GateRef thisObj = builder_.Undefined();
3229 GateRef actualArgc = builder_.Int64(BytecodeCallArgc::ComputeCallArgc(acc_.GetNumValueIn(gate),
3231 GateRef actualArgv = builder_.IntPtr(0);
3232 GateRef newTarget = builder_.Undefined();
3243 GateRef actualArgc = builder_.Int64(BytecodeCallArgc::ComputeCallArgc(acc_.GetNumValueIn(gate),
3245 GateRef actualArgv = builder_.IntPtr(0);
3246 GateRef newTarget = builder_.Undefined();
3247 GateRef thisObj = builder_.Undefined();
3260 GateRef actualArgc = builder_.Int64(BytecodeCallArgc::ComputeCallArgc(acc_.GetNumValueIn(gate),
3262 GateRef actualArgv = builder_.IntPtr(0);
3263 GateRef newTarget = builder_.Undefined();
3264 GateRef thisObj = builder_.Undefined();
3278 GateRef actualArgc = builder_.Int64(BytecodeCallArgc::ComputeCallArgc(acc_.GetNumValueIn(gate),
3280 GateRef actualArgv = builder_.IntPtr(0);
3281 GateRef newTarget = builder_.Undefined();
3295 GateRef actualArgc = builder_.Int64(BytecodeCallArgc::ComputeCallArgc(acc_.GetNumValueIn(gate),
3297 GateRef actualArgv = builder_.IntPtr(0);
3298 GateRef newTarget = builder_.Undefined();
3325 Environment env(gate, circuit_, &builder_);
3341 Label exit(&builder_);
3342 DEFVALUE(res, (&builder_), VariableType::JS_ANY(), builder_.Undefined());
3344 builder_.Bind(&exit);
3346 GateRef result = builder_.CallStub(
3348 GateRef state = builder_.GetState();
3354 Environment env(gate, circuit_, &builder_);
3370 Label exit(&builder_);
3371 DEFVALUE(res, (&builder_), VariableType::JS_ANY(), builder_.Undefined());
3373 builder_.Bind(&exit);
3374 acc_.ReplaceGate(gate, builder_.GetState(), builder_.GetDepend(), *res);
3379 Environment env(gate, circuit_, &builder_);
3395 Label exit(&builder_);
3396 DEFVALUE(res, (&builder_), VariableType::JS_ANY(), builder_.Undefined());
3398 builder_.Bind(&exit);
3400 GateRef result = builder_.CallStub(
3402 GateRef state = builder_.GetState();
3410 Label fastCall(&builder_);
3411 Label notFastCall(&builder_);
3412 Label slowCall(&builder_);
3413 Label slowPath(&builder_);
3414 BRANCH_CIR(builder_.JudgeAotAndFastCall(func, CircuitBuilder::JudgeMethodType::HAS_AOT_FASTCALL),
3416 builder_.Bind(&fastCall);
3419 builder_.StartCallTimer(glue_, gate, {glue_, func, builder_.True()}, true);
3420 GateRef code = builder_.GetCodeAddr(func);
3421 auto depend = builder_.GetDepend();
3423 result->WriteVariable(builder_.Call(cs, glue, code, depend, argsFastCall, gate, "callFastAOT"));
3424 builder_.EndCallTimer(glue_, gate, {glue_, func}, true);
3425 builder_.Jump(exit);
3427 builder_.StartCallTimer(glue_, gate, {glue_, func, builder_.True()}, true);
3429 GateRef target = builder_.IntPtr(RTSTUB_ID(OptimizedFastCallAndPushArgv));
3430 auto depend = builder_.GetDepend();
3431 result->WriteVariable(builder_.Call(cs, glue, target, depend, args, gate, "callFastBridge"));
3432 builder_.EndCallTimer(glue_, gate, {glue_, func}, true);
3433 builder_.Jump(exit);
3436 builder_.Bind(&notFastCall);
3437 BRANCH_CIR(builder_.JudgeAotAndFastCall(func, CircuitBuilder::JudgeMethodType::HAS_AOT),
3439 builder_.Bind(&slowCall);
3442 builder_.StartCallTimer(glue_, gate, {glue_, func, builder_.True()}, true);
3443 GateRef code = builder_.GetCodeAddr(func);
3444 auto depend = builder_.GetDepend();
3446 result->WriteVariable(builder_.Call(cs, glue, code, depend, args, gate, "callAOT"));
3447 builder_.EndCallTimer(glue_, gate, {glue_, func}, true);
3448 builder_.Jump(exit);
3450 builder_.StartCallTimer(glue_, gate, {glue_, func, builder_.True()}, true);
3452 GateRef target = builder_.IntPtr(RTSTUB_ID(OptimizedCallAndPushArgv));
3453 auto depend = builder_.GetDepend();
3454 result->WriteVariable(builder_.Call(cs, glue, target, depend, args, gate, "callBridge"));
3455 builder_.EndCallTimer(glue_, gate, {glue_, func}, true);
3456 builder_.Jump(exit);
3459 builder_.Bind(&slowPath);
3461 builder_.StartCallTimer(glue_, gate, {glue_, func, builder_.True()}, true);
3463 GateRef target = builder_.IntPtr(RTSTUB_ID(JSCallNew));
3464 auto depend = builder_.GetDepend();
3465 result->WriteVariable(builder_.Call(cs, glue, target, depend, args, gate, "slowNew"));
3466 builder_.EndCallTimer(glue_, gate, {glue_, func}, true);
3467 builder_.Jump(exit);
3475 Label isHeapObject(&builder_);
3476 Label isJsFcuntion(&builder_);
3477 Label fastCall(&builder_);
3478 Label notFastCall(&builder_);
3479 Label call(&builder_);
3480 Label call1(&builder_);
3481 Label slowCall(&builder_);
3482 Label callBridge(&builder_);
3483 Label callBridge1(&builder_);
3484 Label slowPath(&builder_);
3485 Label notCallConstructor(&builder_);
3486 Label isCallConstructor(&builder_);
3487 BRANCH_CIR(builder_.TaggedIsHeapObject(func), &isHeapObject, &slowPath);
3488 builder_.Bind(&isHeapObject);
3490 BRANCH_CIR(builder_.IsJSFunction(func), &isJsFcuntion, &slowPath);
3491 builder_.Bind(&isJsFcuntion);
3494 BRANCH_CIR(builder_.IsClassConstructor(func), &slowPath, &notCallConstructor);
3495 builder_.Bind(&notCallConstructor);
3497 GateRef method = builder_.GetMethodFromFunction(func);
3498 BRANCH_CIR(builder_.JudgeAotAndFastCall(func,
3500 builder_.Bind(&fastCall);
3502 GateRef expectedArgc = builder_.Int64Add(builder_.GetExpectedNumOfArgs(method),
3503 builder_.Int64(NUM_MANDATORY_JSFUNC_ARGS));
3504 BRANCH_CIR(builder_.Equal(expectedArgc, argc), &call, &callBridge);
3505 builder_.Bind(&call);
3507 builder_.StartCallTimer(glue_, gate, {glue_, func, builder_.True()}, true);
3508 GateRef code = builder_.GetCodeAddr(func);
3509 auto depend = builder_.GetDepend();
3511 result->WriteVariable(builder_.Call(cs, glue, code, depend, argsFastCall, gate, "callFastAOT"));
3512 builder_.EndCallTimer(glue_, gate, {glue_, func}, true);
3513 builder_.Jump(exit);
3515 builder_.Bind(&callBridge);
3517 builder_.StartCallTimer(glue_, gate, {glue_, func, builder_.True()}, true);
3519 GateRef target = builder_.IntPtr(RTSTUB_ID(OptimizedFastCallAndPushArgv));
3520 auto depend = builder_.GetDepend();
3521 result->WriteVariable(builder_.Call(cs, glue, target, depend, args, gate, "callFastBridge"));
3522 builder_.EndCallTimer(glue_, gate, {glue_, func}, true);
3523 builder_.Jump(exit);
3526 builder_.Bind(&notFastCall);
3527 BRANCH_CIR(builder_.JudgeAotAndFastCall(func, CircuitBuilder::JudgeMethodType::HAS_AOT),
3529 builder_.Bind(&slowCall);
3531 GateRef expectedArgc = builder_.Int64Add(builder_.GetExpectedNumOfArgs(method),
3532 builder_.Int64(NUM_MANDATORY_JSFUNC_ARGS));
3533 BRANCH_CIR(builder_.Equal(expectedArgc, argc), &call1, &callBridge1);
3534 builder_.Bind(&call1);
3536 builder_.StartCallTimer(glue_, gate, {glue_, func, builder_.True()}, true);
3537 GateRef code = builder_.GetCodeAddr(func);
3538 auto depend = builder_.GetDepend();
3540 result->WriteVariable(builder_.Call(cs, glue, code, depend, args, gate, "callAOT"));
3541 builder_.EndCallTimer(glue_, gate, {glue_, func}, true);
3542 builder_.Jump(exit);
3544 builder_.Bind(&callBridge1);
3546 builder_.StartCallTimer(glue_, gate, {glue_, func, builder_.True()}, true);
3548 GateRef target = builder_.IntPtr(RTSTUB_ID(OptimizedCallAndPushArgv));
3549 auto depend = builder_.GetDepend();
3550 result->WriteVariable(builder_.Call(cs, glue, target, depend, args, gate, "callBridge"));
3551 builder_.EndCallTimer(glue_, gate, {glue_, func}, true);
3552 builder_.Jump(exit);
3557 builder_.Bind(&slowPath);
3560 builder_.StartCallTimer(glue_, gate, {glue_, func, builder_.True()}, true);
3562 GateRef target = builder_.IntPtr(RTSTUB_ID(JSCallNew));
3563 auto depend = builder_.GetDepend();
3564 result->WriteVariable(builder_.Call(cs, glue, target, depend, args, gate, "slowNew"));
3565 builder_.EndCallTimer(glue_, gate, {glue_, func}, true);
3566 builder_.Jump(exit);
3568 builder_.StartCallTimer(glue_, gate, {glue_, func, builder_.True()}, true);
3570 GateRef target = builder_.IntPtr(RTSTUB_ID(JSCall));
3571 auto depend = builder_.GetDepend();
3572 result->WriteVariable(builder_.Call(cs, glue, target, depend, args, gate, "jscall"));
3573 builder_.EndCallTimer(glue_, gate, {glue_, func}, true);
3574 builder_.Jump(exit);
3581 Environment env(gate, circuit_, &builder_);
3583 GateRef code = builder_.GetCodeAddr(func);
3589 GateRef state = builder_.GetState();
3590 auto depend = builder_.GetDepend();
3592 GateRef result = builder_.Call(cs, glue_, code, depend, args, gate, "callAOT");
3598 Environment env(gate, circuit_, &builder_);
3600 GateRef code = builder_.GetCodeAddr(func);
3606 GateRef state = builder_.GetState();
3607 auto depend = builder_.GetDepend();
3609 GateRef result = builder_.Call(cs, glue_, code, depend, args, gate, "callFastAOT");
3615 Environment env(gate, circuit_, &builder_);
3616 Label slowPath(&builder_);
3617 Label dispatch(&builder_);
3618 Label checkStackOver(&builder_);
3619 Label stackOverflow(&builder_);
3620 GateRef stackLimit = builder_.Load(VariableType::INT64(), glue_,
3621 builder_.IntPtr(JSThread::GlueData::GetStackLimitOffset(builder_.GetCompilationConfig()->Is32Bit())));
3622 GateRef interruptsFlag = builder_.Load(VariableType::INT8(), glue_,
3623 builder_.IntPtr(JSThread::GlueData::GetInterruptVectorOffset(builder_.GetCompilationConfig()->Is32Bit())));
3624 GateRef spValue = builder_.ReadSp();
3625 builder_.Branch(builder_.Int8Equal(interruptsFlag, builder_.Int8(VmThreadControl::VM_NEED_SUSPENSION)),
3627 builder_.Bind(&slowPath);
3630 builder_.Jump(&checkStackOver);
3632 builder_.Bind(&checkStackOver);
3634 builder_.Branch(builder_.Int64LessThanOrEqual(spValue, stackLimit), &stackOverflow, &dispatch,
3636 builder_.Bind(&stackOverflow);
3639 builder_.Return(res);
3642 builder_.Bind(&dispatch);
3643 acc_.ReplaceGate(gate, builder_.GetState(), builder_.GetDepend(), Circuit::NullGate());
3658 builder_.ToTaggedInt(levelIndex), builder_.ToTaggedInt(slotIndex), obj});
3675 builder_.ToTaggedInt(levelIndex), builder_.ToTaggedInt(slotIndex), obj, value});
3691 builder_.ToTaggedInt(levelIndex), builder_.ToTaggedInt(slotIndex), obj});
3710 GateRef stringId = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 1));
3712 GateRef module = builder_.GetModuleFromFunction(jsFunc);
3713 GateRef propKey = builder_.GetObjectFromConstPool(glue_, gate, sharedConstPool, Circuit::NullGate(), module,
3717 GateRef newGate = builder_.CallStub(glue_, gate, CommonStubCSigns::DefineField,
3730 GateRef newGate = builder_.CallStub(glue_, gate, CommonStubCSigns::DefineField,
3740 GateRef propKey = builder_.ToTaggedInt(acc_.GetValueIn(gate, 0));
3743 GateRef newGate = builder_.CallStub(glue_, gate, CommonStubCSigns::DefineField,
3769 GateRef module = builder_.GetModuleFromFunction(jsFunc);
3772 builder_.ToTaggedInt(count), constpool, builder_.ToTaggedInt(literalId), module});
3788 builder_.ToTaggedInt(levelIndex), builder_.ToTaggedInt(slotIndex), obj, value});
3802 GateRef module = builder_.GetModuleFromFunction(jsFunc);
3803 auto args = { proto, constpool, builder_.ToTaggedInt(methodId), builder_.ToTaggedInt(literalId),
3804 builder_.ToTaggedInt(length), module };
3813 GateRef newGate = LowerCallRuntime(gate, RTSTUB_ID(LdSendableClass), { lexicalEnv, builder_.ToTaggedInt(level) });
3821 GateRef index = builder_.ToTaggedInt(acc_.GetValueIn(gate, 0));
3833 GateRef actualArgc = builder_.Int64(BytecodeCallArgc::ComputeCallArgc(acc_.GetNumValueIn(gate),
3835 GateRef actualArgv = builder_.IntPtr(0);
3836 GateRef newTarget = builder_.Undefined();
3844 GateRef stringId = builder_.TruncInt64ToInt32(acc_.GetValueIn(gate, 0));
3847 GateRef module = builder_.GetModuleFromFunction(jsFunc);
3848 GateRef res = builder_.GetObjectFromConstPool(glue_, gate, sharedConstPool, Circuit::NullGate(), module, stringId,
3864 acc_.UpdateAllUses(gate, builder_.Undefined());
3869 GateRef methodOffset = builder_.IntPtr(JSFunctionBase::METHOD_OFFSET);
3870 GateRef method = builder_.Load(VariableType::JS_POINTER(), jsFunc, methodOffset, acc_.GetDependRoot());
3872 builder_.Load(VariableType::JS_ANY(), method, builder_.IntPtr(Method::CONSTANT_POOL_OFFSET), method);
3888 acc_.UpdateAllUses(gate, builder_.Undefined());
3893 GateRef constPoolSize = builder_.Load(VariableType::INT32(), sharedConstPool,
3894 builder_.IntPtr(TaggedArray::LENGTH_OFFSET), sharedConstPool);
3895 GateRef unshareIdx = builder_.Int32Sub(constPoolSize, builder_.Int32(ConstantPool::UNSHARED_CONSTPOOL_INDEX));
3897 builder_.PtrMul(builder_.ZExtInt32ToPtr(unshareIdx), builder_.IntPtr(JSTaggedValue::TaggedTypeSize()));
3898 GateRef dataOffset = builder_.PtrAdd(offset, builder_.IntPtr(TaggedArray::DATA_OFFSET));
3899 GateRef index = builder_.Load(VariableType::JS_ANY(), sharedConstPool, dataOffset, constPoolSize);
3902 builder_.Load(VariableType::NATIVE_POINTER(), glue_, builder_.IntPtr(unshareCpOffset), index);
3904 builder_.PtrAdd(unshareCpAddr, builder_.PtrMul(builder_.IntPtr(JSTaggedValue::TaggedTypeSize()),
3905 builder_.ZExtInt32ToPtr(builder_.TaggedGetInt(index))));
3907 builder_.Load(VariableType::JS_ANY(), unshareCpDataOffset, builder_.IntPtr(0), unshareCpAddr);
3919 GateRef index = builder_.ToTaggedInt(acc_.GetValueIn(gate, 0));
3929 GateRef index = builder_.ToTaggedInt(acc_.GetValueIn(gate, 0));