Fix rsp frame of x64

1. Fix constructing builtin entry frame
2. Fix push argc
Issue:https://gitee.com/openharmony/ark_js_runtime/issues/I57XTS?from=project-issue

Signed-off-by: zhangyukun <zhangyukun8@huawei.com>
Change-Id: If300c905a65a6fee7436963accf7173fe8047944
This commit is contained in:
zhangyukun 2022-05-17 19:56:29 +08:00
parent 671382bfb6
commit 5a6c197a42
6 changed files with 69 additions and 11 deletions

View File

@ -1037,6 +1037,36 @@ void AssemblerX64::And(Register src, Register dst)
EmitModrm(src, dst);
}
void AssemblerX64::Or(Immediate src, Register dst)
{
EmitRexPrefixW(dst);
if (InRange8(src.Value())) {
// 83: or r/m64, imm8
EmitU8(0x83);
// 1: 83 /1 ib
EmitModrm(1, dst);
EmitI8(static_cast<int8_t>(src.Value()));
} else if (dst == rax) {
// 0x0D: or rax, imm32
EmitU8(0x0D);
EmitI32(src.Value());
} else {
// 81: or r/m64, imm32
EmitU8(0x81);
// 1: 81 /1 id
EmitModrm(1, dst);
EmitI32(src.Value());
}
}
void AssemblerX64::Orq(Register src, Register dst)
{
EmitRexPrefix(src, dst);
// 09 : Or r/m64, r64
EmitU8(0x09);
EmitModrm(src, dst);
}
void AssemblerX64::Jnz(Label *target, Distance distance)
{
if (target->IsBound()) {

View File

@ -120,6 +120,8 @@ public:
void Andq(Immediate src, Register dst);
void Andl(Immediate src, Register dst);
void And(Register src, Register dst);
void Or(Immediate src, Register dst);
void Orq(Register src, Register dst);
void Btq(Immediate src, Register dst);
void Btl(Immediate src, Register dst);
void Cmpl(Register src, Register dst);

View File

@ -73,4 +73,17 @@ void ExtendedAssemblerX64::PushArgsWithArgv(Register argc, Register argv, Regist
Subq(1, argc);
Ja(&loopBeginning);
}
void ExtendedAssemblerX64::PushArgc(int32_t argc, Register tempArgcRegister)
{
Movabs(JSTaggedValue(argc).GetRawData(), tempArgcRegister);
Pushq(tempArgcRegister);
}
void ExtendedAssemblerX64::PushArgc(Register argcRegister, Register tempArgcRegister)
{
Movabs(JSTaggedValue::TAG_INT, tempArgcRegister);
Orq(argcRegister, tempArgcRegister);
Pushq(tempArgcRegister);
}
} // panda::ecmascript::x64

View File

@ -33,6 +33,8 @@ public:
void PushGhcCalleeSaveRegisters();
void PopGhcCalleeSaveRegisters();
void PushArgsWithArgv(Register argc, Register argv, Register operatorRegister);
void PushArgc(int32_t argc, Register tempArgcRegister);
void PushArgc(Register argcRegister, Register tempArgcRegister);
};
} // panda::ecmascript::x64
#endif // ECMASCRIPT_COMPILER_EXTENDED_ASSEMBLER_X64_H

View File

@ -1131,7 +1131,8 @@ void AssemblerStubsX64::PushArgsSlowPath(ExtendedAssemblerX64 *assembler, Regist
// fall through
__ Bind(&haveExtra);
{
__ Pushq(argcRegister);
Register tempArgcRegister = r15;
__ PushArgc(argcRegister, tempArgcRegister);
__ Subq(argcRegister, declaredNumArgsRegister);
__ Cmpq(0, declaredNumArgsRegister);
__ Jle(&jumpToFastPath);
@ -1300,7 +1301,8 @@ void AssemblerStubsX64::PushCallIThisRangeAndDispatchSlowPath(ExtendedAssemblerX
__ Bind(&haveExtraEntry);
{
__ Pushq(argcRegister);
Register tempArgcRegister = r9;
__ PushArgc(argcRegister, tempArgcRegister);
__ Movq(declaredNumArgsRegister, diffRegister);
__ Subq(argcRegister, diffRegister);
__ Cmpq(0, diffRegister);
@ -1345,7 +1347,8 @@ void AssemblerStubsX64::PushCallIRangeAndDispatchSlowPath(ExtendedAssemblerX64 *
__ Bind(&haveExtraEntry);
{
__ Pushq(argcRegister);
Register tempArgcRegister = r9;
__ PushArgc(argcRegister, tempArgcRegister);
__ Movq(declaredNumArgsRegister, diffRegister);
__ Subq(argcRegister, diffRegister);
__ Cmpq(0, diffRegister);
@ -1390,7 +1393,8 @@ void AssemblerStubsX64::PushCallArgs3AndDispatchSlowPath(ExtendedAssemblerX64 *a
__ Bind(&haveExtraEntry);
{
__ Pushq(argc);
Register tempArgcRegister = r9;
__ PushArgc(argc, tempArgcRegister);
__ Movq(declaredNumArgsRegister, diffRegister);
__ Subq(argc, diffRegister);
__ Cmpq(0, diffRegister);
@ -1435,7 +1439,8 @@ void AssemblerStubsX64::PushCallArgs2AndDispatchSlowPath(ExtendedAssemblerX64 *a
__ Bind(&haveExtraEntry);
{
__ Pushq(argc);
Register tempArgcRegister = r9;
__ PushArgc(argc, tempArgcRegister);
__ Movq(declaredNumArgsRegister, diffRegister);
__ Subq(argc, diffRegister);
__ Cmpq(0, diffRegister);
@ -1480,7 +1485,8 @@ void AssemblerStubsX64::PushCallArgs1AndDispatchSlowPath(ExtendedAssemblerX64 *a
__ Bind(&haveExtraEntry);
{
__ Pushq(argc);
Register tempArgcRegister = r9;
__ PushArgc(argc, tempArgcRegister);
__ Movq(declaredNumArgsRegister, diffRegister);
__ Subq(argc, diffRegister);
__ Cmpq(0, diffRegister);
@ -1525,7 +1531,8 @@ void AssemblerStubsX64::PushCallArgs0AndDispatchSlowPath(ExtendedAssemblerX64 *a
__ Bind(&haveExtraEntry);
{
__ Pushq(argc);
Register tempArgcRegister = r9;
__ PushArgc(argc, tempArgcRegister);
__ Movq(declaredNumArgsRegister, diffRegister);
__ Subq(argc, diffRegister);
__ Cmpq(0, diffRegister);
@ -1935,15 +1942,15 @@ void AssemblerStubsX64::CallNativeEntry(ExtendedAssemblerX64 *assembler)
Register function = r9;
Register nativeCode = rbx;
// skip nativeCode & argc
__ Addq(16, rsp);
__ Push(function);
// 24: skip nativeCode & argc & returnAddr
__ Subq(24, rsp);
PushBuiltinFrame(assembler, glue, FrameType::BUILTIN_ENTRY_FRAME);
__ Movq(Operand(method, JSMethod::GetBytecodeArrayOffset(false)), nativeCode); // get native pointer
CallNativeInternal(assembler, glue, argc, argv, nativeCode);
// 24: skip function
__ Addq(24, rsp);
// 32: skip function
__ Addq(32, rsp);
__ Ret();
}

View File

@ -464,11 +464,15 @@ JSTaggedValue EcmaInterpreter::Execute(EcmaRuntimeCallInfo *info)
JSThread *thread = info->GetThread();
INTERPRETER_TRACE(thread, Execute);
if (thread->IsAsmInterpreter()) {
#if ECMASCRIPT_ENABLE_ASM_INTERPRETER_RSP_STACK
return InterpreterAssembly::Execute(info);
#else
auto prevLeaveFrame = const_cast<JSTaggedType *>(thread->GetLastLeaveFrame());
thread->SetLastLeaveFrame(nullptr); // avoid setting again in NewRuntimeCallInfo()
JSTaggedValue asmResult = InterpreterAssembly::Execute(info);
thread->SetLastLeaveFrame(prevLeaveFrame);
return asmResult;
#endif
}
JSHandle<JSTaggedValue> func = info->GetFunction();
ECMAObject *callTarget = reinterpret_cast<ECMAObject*>(func.GetTaggedValue().GetTaggedObject());