mirror of
https://gitee.com/openharmony/arkcompiler_ets_runtime
synced 2024-10-07 08:03:29 +00:00
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:
parent
671382bfb6
commit
5a6c197a42
@ -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()) {
|
||||
|
@ -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);
|
||||
|
@ -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
|
@ -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
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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());
|
||||
|
Loading…
Reference in New Issue
Block a user