implments call this

Signed-off-by: sunzhe23 <sunzhe23@huawei.com>
This commit is contained in:
sunzhe23 2022-08-31 18:48:35 +08:00
parent 45a0088a30
commit 9c21a1055e
22 changed files with 200 additions and 86 deletions

View File

@ -19,9 +19,9 @@
namespace panda::ecmascript::aarch64 {
Register ExtendedAssembler::ghcJSCallDispacherArgs_[JS_CALL_DISPATCHER_ARGS_COUNT] =
{ X19, FP, X20, X21, X22, X23, X24, X25 };
{ X19, FP, X20, X21, X22, X23, X24, X25, X26 };
Register ExtendedAssembler::cppJSCallDispacherArgs_[JS_CALL_DISPATCHER_ARGS_COUNT] =
{ X0, FP, X1, X2, X3, X4, X5, INVALID_REG };
{ X0, FP, X1, X2, X3, X4, X5, INVALID_REG, INVALID_REG };
void ExtendedAssembler::CalleeSave()
{

View File

@ -19,9 +19,9 @@
namespace panda::ecmascript::x64 {
Register ExtendedAssembler::ghcJSCallDispacherArgs_[JS_CALL_DISPATCHER_ARGS_COUNT] =
{ r13, rbp, r12, rbx, r14, rsi, rdi, r8 };
{ r13, rbp, r12, rbx, r14, rsi, rdi, r8, r9 };
Register ExtendedAssembler::cppJSCallDispacherArgs_[JS_CALL_DISPATCHER_ARGS_COUNT] =
{ rdi, rbp, rsi, rdx, rcx, r8, r9, rInvalid };
{ rdi, rbp, rsi, rdx, rcx, r8, r9, rInvalid, rInvalid };
void ExtendedAssembler::PushAlignBytes()
{

View File

@ -485,6 +485,7 @@ enum class CallDispatchInputs : size_t {
ARG0,
ARG1,
ARG2,
ARG3,
NUM_OF_INPUTS,
ARGC = ARG0,

View File

@ -1394,7 +1394,7 @@ BytecodeInfo BytecodeCircuitBuilder::GetBytecodeInfo(const uint8_t *pc)
case EcmaBytecode::TONUMERIC_IMM8: {
break;
}
case EcmaBytecode::DYNAMICIMPORT_V8: {
case EcmaBytecode::DYNAMICIMPORT: {
uint16_t v0 = READ_INST_8_0();
info.inputs.emplace_back(VirtualRegister(v0));
break;

View File

@ -766,14 +766,14 @@ DEF_CALL_SIGNATURE(PushCallArgsAndDispatchNative)
PUSH_CALL_ARGS_AND_DISPATCH_NATIVE_SIGNATURE(PushCallArgsAndDispatchNative)
}
DEF_CALL_SIGNATURE(PushCallArgs0AndDispatch)
DEF_CALL_SIGNATURE(PushCallArg0AndDispatch)
{
PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallArgs0AndDispatch)
PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallArg0AndDispatch)
}
DEF_CALL_SIGNATURE(PushCallArgs1AndDispatch)
DEF_CALL_SIGNATURE(PushCallArg1AndDispatch)
{
PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallArgs1AndDispatch)
PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallArg1AndDispatch)
}
DEF_CALL_SIGNATURE(PushCallArgs2AndDispatch)
@ -786,6 +786,26 @@ DEF_CALL_SIGNATURE(PushCallArgs3AndDispatch)
PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallArgs3AndDispatch)
}
DEF_CALL_SIGNATURE(PushCallThisArg0AndDispatch)
{
PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallThisArg0AndDispatch)
}
DEF_CALL_SIGNATURE(PushCallThisArg1AndDispatch)
{
PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallThisArg1AndDispatch)
}
DEF_CALL_SIGNATURE(PushCallThisArgs2AndDispatch)
{
PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallThisArgs2AndDispatch)
}
DEF_CALL_SIGNATURE(PushCallThisArgs3AndDispatch)
{
PUSH_CALL_ARGS_AND_DISPATCH_SIGNATURE(PushCallThisArgs3AndDispatch)
}
DEF_CALL_SIGNATURE(PushCallRangeAndDispatchNative)
{
PUSH_CALL_ARGS_AND_DISPATCH_NATIVE_RANGE_SIGNATURE(PushCallRangeAndDispatchNative)

View File

@ -324,14 +324,18 @@ private:
V(GeneratorReEnterAsmInterp) \
V(CallRuntimeWithArgv) \
V(OptimizedCallOptimized) \
V(PushCallArgs0AndDispatch) \
V(PushCallArg0AndDispatch) \
V(PushCallArgsAndDispatchNative) \
V(PushCallArgs1AndDispatch) \
V(PushCallArg1AndDispatch) \
V(PushCallArgs2AndDispatch) \
V(PushCallArgs3AndDispatch) \
V(PushCallRangeAndDispatch) \
V(PushCallRangeAndDispatchNative) \
V(PushCallThisRangeAndDispatch) \
V(PushCallThisArg0AndDispatch) \
V(PushCallThisArg1AndDispatch) \
V(PushCallThisArgs2AndDispatch) \
V(PushCallThisArgs3AndDispatch) \
V(PushCallNewAndDispatchNative) \
V(PushCallNewAndDispatch) \
V(CallGetter) \

View File

@ -3046,14 +3046,14 @@ DECLARE_ASM_HANDLER(HandleStobjbynameImm8Id16V8)
Bind(&tryFastPath);
{
GateRef stringId = ReadInst16_1(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
result = SetPropertyByName(glue, receiver, propKey, acc, false);
Branch(TaggedIsHole(*result), &slowPath, &checkException);
}
Bind(&slowPath);
{
GateRef stringId = ReadInst16_1(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
GateRef ret = CallRuntime(glue, RTSTUB_ID(StoreICByName),
{ profileTypeInfo, receiver, propKey, acc, IntToTaggedTypeNGC(slotId) });
result = ChangeTaggedPointerToInt64(ret);
@ -3083,14 +3083,14 @@ DECLARE_ASM_HANDLER(HandleStobjbynameImm16Id16V8)
Bind(&tryFastPath);
{
GateRef stringId = ReadInst16_2(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
result = SetPropertyByName(glue, receiver, propKey, acc, false);
Branch(TaggedIsHole(*result), &slowPath, &checkException);
}
Bind(&slowPath);
{
GateRef stringId = ReadInst16_2(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
GateRef ret = CallRuntime(glue, RTSTUB_ID(StoreICByName),
{ profileTypeInfo, receiver, propKey, acc, IntToTaggedTypeNGC(slotId) });
result = ChangeTaggedPointerToInt64(ret);
@ -3098,7 +3098,7 @@ DECLARE_ASM_HANDLER(HandleStobjbynameImm16Id16V8)
}
Bind(&checkException);
{
CHECK_EXCEPTION(*result, INT_PTR(STOBJBYNAME_IMM8_ID16_V8));
CHECK_EXCEPTION(*result, INT_PTR(STOBJBYNAME_IMM16_ID16_V8));
}
}
@ -3192,7 +3192,7 @@ DECLARE_ASM_HANDLER(HandleStownbynameImm8Id16V8)
{
auto env = GetEnvironment();
GateRef stringId = ReadInst16_1(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
GateRef receiver = GetVregValue(sp, ZExtInt8ToPtr(ReadInst8_3(pc)));
DEFVARIABLE(result, VariableType::INT64(), Hole(VariableType::INT64()));
Label checkResult(env);
@ -3230,7 +3230,7 @@ DECLARE_ASM_HANDLER(HandleStownbynameImm16Id16V8)
{
auto env = GetEnvironment();
GateRef stringId = ReadInst16_2(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
GateRef receiver = GetVregValue(sp, ZExtInt8ToPtr(ReadInst8_4(pc)));
DEFVARIABLE(result, VariableType::INT64(), Hole(VariableType::INT64()));
Label checkResult(env);
@ -3269,7 +3269,7 @@ DECLARE_ASM_HANDLER(HandleStownbynamewithnamesetImm8Id16V8)
auto env = GetEnvironment();
GateRef stringId = ReadInst16_1(pc);
GateRef receiver = GetVregValue(sp, ZExtInt8ToPtr(ReadInst8_3(pc)));
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
Label isJSObject(env);
Label notJSObject(env);
Label notClassConstructor(env);
@ -3311,7 +3311,7 @@ DECLARE_ASM_HANDLER(HandleStownbynamewithnamesetImm16Id16V8)
auto env = GetEnvironment();
GateRef stringId = ReadInst16_2(pc);
GateRef receiver = GetVregValue(sp, ZExtInt8ToPtr(ReadInst8_4(pc)));
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
Label isJSObject(env);
Label notJSObject(env);
Label notClassConstructor(env);
@ -3389,7 +3389,7 @@ DECLARE_ASM_HANDLER(HandleLdaStrId16)
DEFVARIABLE(varAcc, VariableType::JS_ANY(), acc);
GateRef stringId = ReadInst16_0(pc);
varAcc = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
varAcc = GetStringFromConstPool(constpool, stringId);
DISPATCH_WITH_ACC(LDA_STR_ID16);
}
@ -4458,7 +4458,7 @@ DECLARE_ASM_HANDLER(HandleDynamicimportV8)
GateRef v0 = ReadInst8_1(pc);
GateRef specifier = GetVregValue(sp, ZExtInt8ToPtr(v0));
GateRef res = CallRuntime(glue, RTSTUB_ID(DynamicImport), { specifier });
CHECK_EXCEPTION_WITH_ACC(res, INT_PTR(DYNAMICIMPORT_V8));
CHECK_EXCEPTION_WITH_ACC(res, INT_PTR(DYNAMICIMPORT));
}
DECLARE_ASM_HANDLER(HandleCreateasyncgeneratorobjV8)
@ -4829,7 +4829,7 @@ DECLARE_ASM_HANDLER(HandleStconsttoglobalrecordImm16Id16)
DEFVARIABLE(varAcc, VariableType::JS_ANY(), acc);
GateRef stringId = ReadInst16_2(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
GateRef result = CallRuntime(glue, RTSTUB_ID(StGlobalRecord),
{ propKey, *varAcc, TaggedTrue() });
CHECK_EXCEPTION_VARACC(result, INT_PTR(STCONSTTOGLOBALRECORD_IMM16_ID16));
@ -4839,8 +4839,8 @@ DECLARE_ASM_HANDLER(HandleSttoglobalrecordImm16Id16)
{
DEFVARIABLE(varAcc, VariableType::JS_ANY(), acc);
GateRef stringId = ReadInst32_2(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef stringId = ReadInst16_2(pc);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
GateRef result = CallRuntime(glue, RTSTUB_ID(StGlobalRecord),
{ propKey, *varAcc, TaggedFalse() });
CHECK_EXCEPTION_VARACC(result, INT_PTR(STTOGLOBALRECORD_IMM16_ID16));
@ -4851,7 +4851,7 @@ DECLARE_ASM_HANDLER(HandleDeprecatedStconsttoglobalrecordPrefId32)
DEFVARIABLE(varAcc, VariableType::JS_ANY(), acc);
GateRef stringId = ReadInst32_1(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
GateRef result = CallRuntime(glue, RTSTUB_ID(StGlobalRecord),
{ propKey, *varAcc, TaggedTrue() });
CHECK_EXCEPTION_VARACC(result, INT_PTR(DEPRECATED_STCONSTTOGLOBALRECORD_PREF_ID32));
@ -4862,7 +4862,7 @@ DECLARE_ASM_HANDLER(HandleDeprecatedStlettoglobalrecordPrefId32)
DEFVARIABLE(varAcc, VariableType::JS_ANY(), acc);
GateRef stringId = ReadInst32_1(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
GateRef result = CallRuntime(glue, RTSTUB_ID(StGlobalRecord),
{ propKey, *varAcc, TaggedFalse() });
CHECK_EXCEPTION_VARACC(result, INT_PTR(DEPRECATED_STLETTOGLOBALRECORD_PREF_ID32));
@ -4873,7 +4873,7 @@ DECLARE_ASM_HANDLER(HandleDeprecatedStclasstoglobalrecordPrefId32)
DEFVARIABLE(varAcc, VariableType::JS_ANY(), acc);
GateRef stringId = ReadInst32_1(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
GateRef result = CallRuntime(glue, RTSTUB_ID(StGlobalRecord),
{ propKey, *varAcc, TaggedFalse() });
CHECK_EXCEPTION_VARACC(result, INT_PTR(DEPRECATED_STCLASSTOGLOBALRECORD_PREF_ID32));
@ -5158,14 +5158,14 @@ DECLARE_ASM_HANDLER(HandleLdobjbynameImm8Id16)
{
GateRef stringId = ReadInst16_1(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
result = GetPropertyByName(glue, receiver, propKey);
Branch(TaggedIsHole(*result), &slowPath, &checkException);
}
Bind(&slowPath);
{
GateRef stringId = ReadInst16_1(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
result = CallRuntime(glue, RTSTUB_ID(LoadICByName),
{ profileTypeInfo, receiver, propKey, IntToTaggedTypeNGC(slotId) });
Jump(&checkException);
@ -5195,14 +5195,14 @@ DECLARE_ASM_HANDLER(HandleLdobjbynameImm16Id16)
Bind(&tryFastPath);
{
GateRef stringId = ReadInst16_2(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
result = GetPropertyByName(glue, receiver, propKey);
Branch(TaggedIsHole(*result), &slowPath, &checkException);
}
Bind(&slowPath);
{
GateRef stringId = ReadInst16_2(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
result = CallRuntime(glue, RTSTUB_ID(LoadICByName),
{ profileTypeInfo, receiver, propKey, IntToTaggedTypeNGC(slotId) });
Jump(&checkException);
@ -5225,7 +5225,7 @@ DECLARE_ASM_HANDLER(HandleDeprecatedLdobjbynamePrefId32V8)
GateRef receiver = GetVregValue(sp, ZExtInt8ToPtr(ReadInst8_5(pc)));
GateRef stringId = ReadInst32_1(pc);
GateRef propKey = GetValueFromTaggedArray(VariableType::JS_ANY(), constpool, stringId);
GateRef propKey = GetStringFromConstPool(constpool, stringId);
Branch(TaggedIsHeapObject(receiver), &fastPath, &slowPath);
Bind(&fastPath);
{
@ -5353,7 +5353,7 @@ DECLARE_ASM_HANDLER(HandleDeprecatedCallargs3PrefV8V8V8V8)
DECLARE_ASM_HANDLER(HandleCallrangeImm8Imm8V8)
{
GateRef actualNumArgs = ZExtInt8ToInt32(ReadInst8_1(pc));
GateRef actualNumArgs = Int32Add(ZExtInt8ToInt32(ReadInst8_1(pc)), Int32(1));
GateRef func = acc;
GateRef argv = PtrAdd(sp, ZExtInt8ToPtr(ReadInst8_2(pc)));
GateRef jumpSize = IntPtr(BytecodeInstruction::Size(BytecodeInstruction::Format::IMM8_IMM8_V8));
@ -5365,7 +5365,7 @@ DECLARE_ASM_HANDLER(HandleCallrangeImm8Imm8V8)
DECLARE_ASM_HANDLER(HandleWideCallrangePrefImm16V8)
{
GateRef actualNumArgs = ZExtInt16ToInt32(ReadInst16_1(pc));
GateRef actualNumArgs = Int32Add(ZExtInt16ToInt32(ReadInst16_1(pc)), Int32(1));
GateRef func = acc;
GateRef argv = PtrAdd(sp, ZExtInt8ToPtr(ReadInst8_2(pc)));
GateRef jumpSize = IntPtr(BytecodeInstruction::Size(BytecodeInstruction::Format::PREF_IMM16_V8));

View File

@ -497,7 +497,7 @@ void SlowPathLowering::Lower(GateRef gate)
case EcmaBytecode::TONUMERIC:
LowerToNumeric(gate, glue);
break;
// case DYNAMICIMPORT_V8:
// case DYNAMICIMPORT:
// LowerDynamicImport(gate, glue, jsFunc);
// break;
case EcmaBytecode::LDMODULEVAR:

View File

@ -3971,20 +3971,32 @@ GateRef StubBuilder::JSCallDispatch(GateRef glue, GateRef func, GateRef actualNu
}
switch (mode) {
case JSCallMode::CALL_THIS_ARG0:
result = CallNGCRuntime(glue, RTSTUB_ID(PushCallThisArg0AndDispatch),
{ glue, sp, func, method, callField, data[0] });
Return();
break;
case JSCallMode::CALL_ARG0:
case JSCallMode::DEPRECATED_CALL_ARG0:
result = CallNGCRuntime(glue, RTSTUB_ID(PushCallArgs0AndDispatch),
result = CallNGCRuntime(glue, RTSTUB_ID(PushCallArg0AndDispatch),
{ glue, sp, func, method, callField });
Return();
break;
case JSCallMode::CALL_THIS_ARG1:
result = CallNGCRuntime(glue, RTSTUB_ID(PushCallThisArg1AndDispatch),
{ glue, sp, func, method, callField, data[0], data[1] });
Return();
break;
case JSCallMode::CALL_ARG1:
case JSCallMode::DEPRECATED_CALL_ARG1:
result = CallNGCRuntime(glue, RTSTUB_ID(PushCallArgs1AndDispatch),
result = CallNGCRuntime(glue, RTSTUB_ID(PushCallArg1AndDispatch),
{ glue, sp, func, method, callField, data[0] });
Return();
break;
case JSCallMode::CALL_THIS_ARG2:
result = CallNGCRuntime(glue, RTSTUB_ID(PushCallThisArgs2AndDispatch),
{ glue, sp, func, method, callField, data[0], data[1], data[2] });
Return();
break;
case JSCallMode::CALL_ARG2:
case JSCallMode::DEPRECATED_CALL_ARG2:
result = CallNGCRuntime(glue, RTSTUB_ID(PushCallArgs2AndDispatch),
@ -3992,6 +4004,10 @@ GateRef StubBuilder::JSCallDispatch(GateRef glue, GateRef func, GateRef actualNu
Return();
break;
case JSCallMode::CALL_THIS_ARG3:
result = CallNGCRuntime(glue, RTSTUB_ID(PushCallThisArgs3AndDispatch),
{ glue, sp, func, method, callField, data[0], data[1], data[2], data[3] });
Return();
break;
case JSCallMode::CALL_ARG3:
case JSCallMode::DEPRECATED_CALL_ARG3:
result = CallNGCRuntime(glue, RTSTUB_ID(PushCallArgs3AndDispatch),

View File

@ -400,18 +400,42 @@ void AsmInterpreterCall::PushCallArgs2AndDispatch(ExtendedAssembler *assembler)
JSCallCommonEntry(assembler, JSCallMode::CALL_ARG2);
}
void AsmInterpreterCall::PushCallArgs1AndDispatch(ExtendedAssembler *assembler)
void AsmInterpreterCall::PushCallArg1AndDispatch(ExtendedAssembler *assembler)
{
__ BindAssemblerStub(RTSTUB_ID(PushCallArgs1AndDispatch));
__ BindAssemblerStub(RTSTUB_ID(PushCallArg1AndDispatch));
JSCallCommonEntry(assembler, JSCallMode::CALL_ARG1);
}
void AsmInterpreterCall::PushCallArgs0AndDispatch(ExtendedAssembler *assembler)
void AsmInterpreterCall::PushCallArg0AndDispatch(ExtendedAssembler *assembler)
{
__ BindAssemblerStub(RTSTUB_ID(PushCallArgs0AndDispatch));
__ BindAssemblerStub(RTSTUB_ID(PushCallArg0AndDispatch));
JSCallCommonEntry(assembler, JSCallMode::CALL_ARG0);
}
void AsmInterpreterCall::PushCallThisArg0AndDispatch(ExtendedAssembler *assembler)
{
__ BindAssemblerStub(RTSTUB_ID(PushCallThisArg0AndDispatch));
JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG0);
}
void AsmInterpreterCall::PushCallThisArg1AndDispatch(ExtendedAssembler *assembler)
{
__ BindAssemblerStub(RTSTUB_ID(PushCallThisArg1AndDispatch));
JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG1);
}
void AsmInterpreterCall::PushCallThisArgs2AndDispatch(ExtendedAssembler *assembler)
{
__ BindAssemblerStub(RTSTUB_ID(PushCallThisArgs2AndDispatch));
JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG2);
}
void AsmInterpreterCall::PushCallThisArgs3AndDispatch(ExtendedAssembler *assembler)
{
__ BindAssemblerStub(RTSTUB_ID(PushCallThisArgs3AndDispatch));
JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG3);
}
// uint64_t PushCallRangeAndDispatchNative(uintptr_t glue, uint32_t argc, JSTaggedType calltarget, uintptr_t argv[])
// c++ calling convention call js function
// Input: X0 - glue
@ -1096,7 +1120,6 @@ void AsmInterpreterCall::PushGeneratorFrameState(ExtendedAssembler *assembler, R
// 32: get high 32bit
__ Lsr(operatorRegister, operatorRegister, 32);
__ Add(pcRegister, operatorRegister, pcRegister);
__ Add(pcRegister, pcRegister, Immediate(BytecodeInstruction::Size(BytecodeInstruction::Format::PREF_V8_V8)));
// 2 : pc and fp
__ Stp(fpRegister, pcRegister, MemoryOperand(currentSlotRegister, -2 * FRAME_SLOT_SIZE, AddrMode::PREINDEX));
// jumpSizeAfterCall

View File

@ -124,9 +124,17 @@ public:
static void PushCallArgs2AndDispatch(ExtendedAssembler *assembler);
static void PushCallArgs1AndDispatch(ExtendedAssembler *assembler);
static void PushCallArg1AndDispatch(ExtendedAssembler *assembler);
static void PushCallArgs0AndDispatch(ExtendedAssembler *assembler);
static void PushCallArg0AndDispatch(ExtendedAssembler *assembler);
static void PushCallThisArg0AndDispatch(ExtendedAssembler *assembler);
static void PushCallThisArg1AndDispatch(ExtendedAssembler *assembler);
static void PushCallThisArgs2AndDispatch(ExtendedAssembler *assembler);
static void PushCallThisArgs3AndDispatch(ExtendedAssembler *assembler);
static void PushCallThisRangeAndDispatchNative(ExtendedAssembler *assembler);

View File

@ -196,7 +196,6 @@ void AsmInterpreterCall::PushGeneratorFrameState(ExtendedAssembler *assembler, R
__ Movq(Operand(methodRegister, Method::NATIVE_POINTER_OR_BYTECODE_ARRAY_OFFSET), pcRegister);
__ Movl(Operand(contextRegister, GeneratorContext::GENERATOR_BC_OFFSET_OFFSET), operatorRegister);
__ Addq(operatorRegister, pcRegister);
__ Addq(BytecodeInstruction::Size(BytecodeInstruction::Format::PREF_V8_V8), pcRegister);
__ Pushq(pcRegister); // pc
__ Pushq(fpRegister); // fp
__ Pushq(0); // jumpSizeAfterCall
@ -392,17 +391,40 @@ void AsmInterpreterCall::PushCallArgs2AndDispatch(ExtendedAssembler *assembler)
JSCallCommonEntry(assembler, JSCallMode::CALL_ARG2);
}
void AsmInterpreterCall::PushCallArgs1AndDispatch(ExtendedAssembler *assembler)
void AsmInterpreterCall::PushCallArg1AndDispatch(ExtendedAssembler *assembler)
{
__ BindAssemblerStub(RTSTUB_ID(PushCallArgs1AndDispatch));
__ BindAssemblerStub(RTSTUB_ID(PushCallArg1AndDispatch));
JSCallCommonEntry(assembler, JSCallMode::CALL_ARG1);
}
void AsmInterpreterCall::PushCallArgs0AndDispatch(ExtendedAssembler *assembler)
void AsmInterpreterCall::PushCallArg0AndDispatch(ExtendedAssembler *assembler)
{
__ BindAssemblerStub(RTSTUB_ID(PushCallArgs0AndDispatch));
__ BindAssemblerStub(RTSTUB_ID(PushCallArg0AndDispatch));
JSCallCommonEntry(assembler, JSCallMode::CALL_ARG0);
}
void AsmInterpreterCall::PushCallThisArg0AndDispatch(ExtendedAssembler *assembler)
{
__ BindAssemblerStub(RTSTUB_ID(PushCallThisArg0AndDispatch));
JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG0);
}
void AsmInterpreterCall::PushCallThisArg1AndDispatch(ExtendedAssembler *assembler)
{
__ BindAssemblerStub(RTSTUB_ID(PushCallThisArg1AndDispatch));
JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG1);
}
void AsmInterpreterCall::PushCallThisArgs2AndDispatch(ExtendedAssembler *assembler)
{
__ BindAssemblerStub(RTSTUB_ID(PushCallThisArgs2AndDispatch));
JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG2);
}
void AsmInterpreterCall::PushCallThisArgs3AndDispatch(ExtendedAssembler *assembler)
{
__ BindAssemblerStub(RTSTUB_ID(PushCallThisArgs3AndDispatch));
JSCallCommonEntry(assembler, JSCallMode::CALL_THIS_ARG3);
}
void AsmInterpreterCall::JSCallCommonFastPath(ExtendedAssembler *assembler, JSCallMode mode, Label *stackOverflow)
{
@ -527,12 +549,17 @@ Register AsmInterpreterCall::GetThisRegsiter(ExtendedAssembler *assembler, JSCal
{
switch (mode) {
case JSCallMode::CALL_GETTER:
case JSCallMode::CALL_THIS_ARG0:
return __ CallDispatcherArgument(kungfu::CallDispatchInputs::ARG0);
case JSCallMode::CALL_SETTER:
case JSCallMode::CALL_THIS_ARG1:
return __ CallDispatcherArgument(kungfu::CallDispatchInputs::ARG1);
case JSCallMode::CALL_THIS_ARG2:
case JSCallMode::CALL_CONSTRUCTOR_WITH_ARGV:
case JSCallMode::CALL_THIS_WITH_ARGV:
return __ CallDispatcherArgument(kungfu::CallDispatchInputs::ARG2);
case JSCallMode::CALL_THIS_ARG3:
return __ CallDispatcherArgument(kungfu::CallDispatchInputs::ARG3);
case JSCallMode::CALL_ENTRY:
case JSCallMode::CALL_FROM_AOT: {
Register argvRegister = __ CallDispatcherArgument(kungfu::CallDispatchInputs::ARG1);

View File

@ -95,9 +95,17 @@ public:
static void PushCallArgs2AndDispatch(ExtendedAssembler *assembler);
static void PushCallArgs1AndDispatch(ExtendedAssembler *assembler);
static void PushCallArg1AndDispatch(ExtendedAssembler *assembler);
static void PushCallArgs0AndDispatch(ExtendedAssembler *assembler);
static void PushCallArg0AndDispatch(ExtendedAssembler *assembler);
static void PushCallThisArg0AndDispatch(ExtendedAssembler *assembler);
static void PushCallThisArg1AndDispatch(ExtendedAssembler *assembler);
static void PushCallThisArgs2AndDispatch(ExtendedAssembler *assembler);
static void PushCallThisArgs3AndDispatch(ExtendedAssembler *assembler);
static void PushCallNewAndDispatch(ExtendedAssembler *assembler);

View File

@ -793,13 +793,7 @@ JSTaggedValue EcmaInterpreter::GeneratorReEnterInterpreter(JSThread *thread, JSH
}
uint32_t pcOffset = context->GetBCOffset();
// NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
// TODO: Refactor ??
EcmaOpcode suspendGeneratorOpcode = EcmaOpcode::SUSPENDGENERATOR_V8;
if (UNLIKELY(!method->GetJSPandaFile()->IsNewVersion())) {
suspendGeneratorOpcode = EcmaOpcode::DEPRECATED_SUSPENDGENERATOR_PREF_V8_V8;
}
const uint8_t *resumePc = method->GetBytecodeArray() + pcOffset +
BytecodeInstruction::Size(suspendGeneratorOpcode);
const uint8_t *resumePc = method->GetBytecodeArray() + pcOffset;
InterpretedFrame *state = GET_FRAME(newSp);
state->pc = resumePc;
@ -6518,7 +6512,7 @@ NO_UB_SANITIZE void EcmaInterpreter::RunInternal(JSThread *thread, const uint8_t
LOG_FULL(FATAL) << "not implement";
DISPATCH(STPATCHVAR_IMM8_V8);
}
HANDLE_OPCODE(DYNAMICIMPORT_V8) {
HANDLE_OPCODE(DYNAMICIMPORT) {
uint16_t v0 = READ_INST_8_0();
LOG_INST() << "intrinsics::dynamicimport"
@ -6528,7 +6522,7 @@ NO_UB_SANITIZE void EcmaInterpreter::RunInternal(JSThread *thread, const uint8_t
JSTaggedValue res = SlowRuntimeStub::DynamicImport(thread, specifier);
INTERPRETER_RETURN_IF_ABRUPT(res);
SET_ACC(res);
DISPATCH(DYNAMICIMPORT_V8);
DISPATCH(DYNAMICIMPORT);
}
#include "templates/debugger_instruction_handler.inl"
}
@ -6822,7 +6816,7 @@ std::string GetEcmaOpcodeStr(EcmaOpcode opcode)
{EcmaOpcode::STTHISBYVALUE_IMM16_V8, "STTHISBYVALUE_IMM16_V8"},
{EcmaOpcode::LDPATCHVAR_IMM8, "LDPATCHVAR_IMM8"},
{EcmaOpcode::STPATCHVAR_IMM8_V8, "STPATCHVAR_IMM8_V8"},
{EcmaOpcode::DYNAMICIMPORT_V8, "DYNAMICIMPORT_V8"},
{EcmaOpcode::DYNAMICIMPORT, "DYNAMICIMPORT"},
{EcmaOpcode::DEFINECLASSWITHBUFFER_IMM8_ID16_ID16_IMM16_V8, "DEFINECLASSWITHBUFFER_IMM8_ID16_ID16_IMM16_V8"},
{EcmaOpcode::DEFINECLASSWITHBUFFER_IMM16_ID16_ID16_IMM16_V8, "DEFINECLASSWITHBUFFER_IMM16_ID16_ID16_IMM16_V8"},
{EcmaOpcode::RESUMEGENERATOR, "RESUMEGENERATOR"},

View File

@ -4329,7 +4329,7 @@ void InterpreterAssembly::HandleDynamicimportV8(
JSTaggedValue res = SlowRuntimeStub::DynamicImport(thread, specifier);
INTERPRETER_RETURN_IF_ABRUPT(res);
SET_ACC(res);
DISPATCH(DYNAMICIMPORT_V8);
DISPATCH(DYNAMICIMPORT);
}
void InterpreterAssembly::HandleCallargs3Imm8V8V8V8(
JSThread *thread, const uint8_t *pc, JSTaggedType *sp, JSTaggedValue constpool, JSTaggedValue profileTypeInfo,

View File

@ -23,6 +23,13 @@
#include "ecmascript/mem/c_containers.h"
#include "ecmascript/tagged_array-inl.h"
// TODO
#ifdef NEW_INSTRUCTION_DEFINE
#include "libpandafile/bytecode_instruction-inl.h"
#else
#include "ecmascript/jspandafile/bytecode_inst/new_instruction.h"
#endif
namespace panda::ecmascript {
JSTaggedValue SlowRuntimeHelper::CallBoundFunction(EcmaRuntimeCallInfo *info)
{
@ -93,9 +100,11 @@ void SlowRuntimeHelper::SaveFrameToContext(JSThread *thread, JSHandle<GeneratorC
context->SetRegsArray(thread, regsArray.GetTaggedValue());
context->SetMethod(thread, frameHandler.GetFunction());
BytecodeInstruction ins(frameHandler.GetPc());
auto offset = ins.GetSize();
context->SetAcc(thread, frameHandler.GetAcc());
context->SetLexicalEnv(thread, thread->GetCurrentLexenv());
context->SetNRegs(nregs);
context->SetBCOffset(frameHandler.GetBytecodeOffset());
context->SetBCOffset(frameHandler.GetBytecodeOffset() + offset);
}
} // namespace panda::ecmascript

View File

@ -104,7 +104,7 @@
&&DEBUG_HANDLE_CALLARGS3_IMM8_V8_V8_V8,
&&DEBUG_HANDLE_CALLRANGE_IMM8_IMM8_V8,
&&DEBUG_HANDLE_LDEXTERNALMODULEVAR_IMM8,
&&DEBUG_HANDLE_DYNAMICIMPORT_V8,
&&DEBUG_HANDLE_DYNAMICIMPORT,
&&DEBUG_HANDLE_DEFINEGETTERSETTERBYVALUE_V8_V8_V8_V8,
&&DEBUG_HANDLE_LDTHISBYNAME_IMM8_ID16,
&&DEBUG_HANDLE_LDTHISBYNAME_IMM16_ID16,

View File

@ -713,10 +713,10 @@
NOTIFY_DEBUGGER_EVENT();
REAL_GOTO_DISPATCH_OPCODE(EcmaOpcode::STLEXVAR_IMM4_IMM4);
}
DEBUG_HANDLE_OPCODE(DYNAMICIMPORT_V8)
DEBUG_HANDLE_OPCODE(DYNAMICIMPORT)
{
NOTIFY_DEBUGGER_EVENT();
REAL_GOTO_DISPATCH_OPCODE(EcmaOpcode::DYNAMICIMPORT_V8);
REAL_GOTO_DISPATCH_OPCODE(EcmaOpcode::DYNAMICIMPORT);
}
DEBUG_HANDLE_OPCODE(GETMODULENAMESPACE_IMM8)
{

View File

@ -104,7 +104,7 @@
&&HANDLE_CALLARGS3_IMM8_V8_V8_V8,
&&HANDLE_CALLRANGE_IMM8_IMM8_V8,
&&HANDLE_LDEXTERNALMODULEVAR_IMM8,
&&HANDLE_DYNAMICIMPORT_V8,
&&HANDLE_DYNAMICIMPORT,
&&HANDLE_DEFINEGETTERSETTERBYVALUE_V8_V8_V8_V8,
&&HANDLE_LDTHISBYNAME_IMM8_ID16,
&&HANDLE_LDTHISBYNAME_IMM16_ID16,

View File

@ -392,7 +392,7 @@ enum class Opcode {
CALLARGS3_IMM8_V8_V8_V8 = 88,
CALLRANGE_IMM8_IMM8_V8 = 89,
LDEXTERNALMODULEVAR_IMM8 = 90,
DYNAMICIMPORT_V8 = 91,
DYNAMICIMPORT = 91,
DEFINEGETTERSETTERBYVALUE_V8_V8_V8_V8 = 92,
LDTHISBYNAME_IMM8_ID16 = 93,
LDTHISBYNAME_IMM16_ID16 = 94,
@ -3079,7 +3079,7 @@ constexpr typename BytecodeInst<Mode>::Format BytecodeInst<Mode>::GetFormat(Opco
return BytecodeInst<Mode>::Format::IMM8_IMM8_V8;
case BytecodeInst<Mode>::Opcode::LDEXTERNALMODULEVAR_IMM8:
return BytecodeInst<Mode>::Format::IMM8;
case BytecodeInst<Mode>::Opcode::DYNAMICIMPORT_V8:
case BytecodeInst<Mode>::Opcode::DYNAMICIMPORT:
return BytecodeInst<Mode>::Format::V8;
case BytecodeInst<Mode>::Opcode::DEFINEGETTERSETTERBYVALUE_V8_V8_V8_V8:
return BytecodeInst<Mode>::Format::V8_V8_V8_V8;
@ -3675,7 +3675,7 @@ template<const BytecodeInstMode Mode> inline bool BytecodeInst<Mode>::HasFlag(Fl
return ((Flags::ACC_READ | Flags::ACC_WRITE | Flags::JIT_IC_SLOT | Flags::TWO_SLOT | Flags::ACC_WRITE | Flags::ACC_READ) & flag) == flag; // NOLINT(hicpp-signed-bitwise)
case BytecodeInst<Mode>::Opcode::LDEXTERNALMODULEVAR_IMM8:
return ((Flags::ACC_READ | Flags::ACC_WRITE | Flags::ACC_WRITE) & flag) == flag; // NOLINT(hicpp-signed-bitwise)
case BytecodeInst<Mode>::Opcode::DYNAMICIMPORT_V8:
case BytecodeInst<Mode>::Opcode::DYNAMICIMPORT:
return ((Flags::ACC_READ | Flags::ACC_WRITE | Flags::ACC_WRITE) & flag) == flag; // NOLINT(hicpp-signed-bitwise)
case BytecodeInst<Mode>::Opcode::DEFINEGETTERSETTERBYVALUE_V8_V8_V8_V8:
return ((Flags::ACC_READ | Flags::ACC_WRITE | Flags::ACC_WRITE | Flags::ACC_READ) & flag) == flag; // NOLINT(hicpp-signed-bitwise)
@ -4271,7 +4271,7 @@ template<const BytecodeInstMode Mode> inline bool BytecodeInst<Mode>::IsThrow(Ex
return ((Exceptions::X_NONE) & exception) == exception; // NOLINT(hicpp-signed-bitwise)
case BytecodeInst<Mode>::Opcode::LDEXTERNALMODULEVAR_IMM8:
return ((Exceptions::X_NONE) & exception) == exception; // NOLINT(hicpp-signed-bitwise)
case BytecodeInst<Mode>::Opcode::DYNAMICIMPORT_V8:
case BytecodeInst<Mode>::Opcode::DYNAMICIMPORT:
return ((Exceptions::X_NONE) & exception) == exception; // NOLINT(hicpp-signed-bitwise)
case BytecodeInst<Mode>::Opcode::DEFINEGETTERSETTERBYVALUE_V8_V8_V8_V8:
return ((Exceptions::X_NONE) & exception) == exception; // NOLINT(hicpp-signed-bitwise)
@ -4867,7 +4867,7 @@ template<const BytecodeInstMode Mode> inline bool BytecodeInst<Mode>::CanThrow()
return false;
case BytecodeInst<Mode>::Opcode::LDEXTERNALMODULEVAR_IMM8:
return false;
case BytecodeInst<Mode>::Opcode::DYNAMICIMPORT_V8:
case BytecodeInst<Mode>::Opcode::DYNAMICIMPORT:
return false;
case BytecodeInst<Mode>::Opcode::DEFINEGETTERSETTERBYVALUE_V8_V8_V8_V8:
return false;
@ -5703,7 +5703,7 @@ template<const BytecodeInstMode Mode> std::ostream& operator<<(std::ostream& os,
os << "ldexternalmodulevar";
os << " " << inst.template GetImm<BytecodeInst<Mode>::Format::IMM8, 0>();
break;
case BytecodeInst<Mode>::Opcode::DYNAMICIMPORT_V8:
case BytecodeInst<Mode>::Opcode::DYNAMICIMPORT:
os << "dynamicimport";
os << " v" << inst.template GetVReg<BytecodeInst<Mode>::Format::V8, 0>();
break;
@ -6936,8 +6936,8 @@ std::ostream& operator<<(std::ostream& os, const typename BytecodeInst<Mode>::Op
case BytecodeInst<Mode>::Opcode::LDEXTERNALMODULEVAR_IMM8:
os << "LDEXTERNALMODULEVAR_IMM8";
break;
case BytecodeInst<Mode>::Opcode::DYNAMICIMPORT_V8:
os << "DYNAMICIMPORT_V8";
case BytecodeInst<Mode>::Opcode::DYNAMICIMPORT:
os << "DYNAMICIMPORT";
break;
case BytecodeInst<Mode>::Opcode::DEFINEGETTERSETTERBYVALUE_V8_V8_V8_V8:
os << "DEFINEGETTERSETTERBYVALUE_V8_V8_V8_V8";

View File

@ -1208,7 +1208,7 @@ void PandaFileTranslator::FixOpcode(MethodLiteral *method, const OldBytecodeInst
break;
}
case OldBytecodeInst::Opcode::ECMA_DYNAMICIMPORT_PREF_V8: {
newOpcode = EcmaOpcode::DYNAMICIMPORT_V8;
newOpcode = EcmaOpcode::DYNAMICIMPORT;
*pc = static_cast<uint8_t>(newOpcode);
*(pc + 1) = *(pc + 2);
break;

View File

@ -45,10 +45,14 @@ using JSFunctionEntryType = JSTaggedValue (*)(uintptr_t glue, uintptr_t prevFp,
V(AsmInterpreterEntry) \
V(GeneratorReEnterAsmInterp) \
V(PushCallArgsAndDispatchNative) \
V(PushCallArgs0AndDispatch) \
V(PushCallArgs1AndDispatch) \
V(PushCallArg0AndDispatch) \
V(PushCallArg1AndDispatch) \
V(PushCallArgs2AndDispatch) \
V(PushCallArgs3AndDispatch) \
V(PushCallThisArg0AndDispatch) \
V(PushCallThisArg1AndDispatch) \
V(PushCallThisArgs2AndDispatch) \
V(PushCallThisArgs3AndDispatch) \
V(PushCallRangeAndDispatch) \
V(PushCallNewAndDispatch) \
V(PushCallNewAndDispatchNative) \