mirror of
https://gitee.com/openharmony/arkcompiler_ets_runtime
synced 2024-10-06 23:54:03 +00:00
!846 Refactor trampoline signature and name
Merge pull request !846 from songzhengchao/refactor0322
This commit is contained in:
commit
db34e6272d
@ -417,10 +417,10 @@ DEF_CALL_SIGNATURE(HandleOverflow)
|
||||
callSign->SetParameters(params.data());
|
||||
}
|
||||
|
||||
DEF_CALL_SIGNATURE(RuntimeCallTrampolineInterpreterAsm)
|
||||
DEF_CALL_SIGNATURE(AsmIntCallRuntime)
|
||||
{
|
||||
/* 3 : 3 input parameters */
|
||||
CallSignature runtimeCallTrampoline("RuntimeCallTrampolineInterpreterAsm", 0, 3,
|
||||
CallSignature runtimeCallTrampoline("AsmIntCallRuntime", 0, 3,
|
||||
ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
|
||||
*callSign = runtimeCallTrampoline;
|
||||
std::array<VariableType, 3> params = { /* 3 : 3 input parameters */
|
||||
@ -433,10 +433,10 @@ DEF_CALL_SIGNATURE(RuntimeCallTrampolineInterpreterAsm)
|
||||
callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB);
|
||||
}
|
||||
|
||||
DEF_CALL_SIGNATURE(RuntimeCallTrampolineAot)
|
||||
DEF_CALL_SIGNATURE(OptimizedCallRuntime)
|
||||
{
|
||||
/* 3 : 3 input parameters */
|
||||
CallSignature runtimeCallTrampoline("RuntimeCallTrampolineAot", 0, 3,
|
||||
CallSignature runtimeCallTrampoline("OptimizedCallRuntime", 0, 3,
|
||||
ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
|
||||
*callSign = runtimeCallTrampoline;
|
||||
std::array<VariableType, 3> params = { /* 3 : 3 input parameters */
|
||||
@ -449,10 +449,10 @@ DEF_CALL_SIGNATURE(RuntimeCallTrampolineAot)
|
||||
callSign->SetTargetKind(CallSignature::TargetKind::RUNTIME_STUB);
|
||||
}
|
||||
|
||||
DEF_CALL_SIGNATURE(AotCallAotTrampoline)
|
||||
DEF_CALL_SIGNATURE(OptimizedCallOptimized)
|
||||
{
|
||||
/* 4 : 4 input parameters */
|
||||
CallSignature runtimeCallTrampoline("AotCallAotTrampoline", 0, 4,
|
||||
CallSignature runtimeCallTrampoline("OptimizedCallOptimized", 0, 4,
|
||||
ArgumentsOrder::DEFAULT_ORDER, VariableType::JS_ANY());
|
||||
*callSign = runtimeCallTrampoline;
|
||||
std::array<VariableType, 4> params = { /* 4 : 4 input parameters */
|
||||
|
@ -244,9 +244,9 @@ private:
|
||||
V(SingleStepDebugging) \
|
||||
V(AsmInterpreterEntry) \
|
||||
V(HandleOverflow) \
|
||||
V(RuntimeCallTrampolineInterpreterAsm) \
|
||||
V(RuntimeCallTrampolineAot) \
|
||||
V(AotCallAotTrampoline) \
|
||||
V(AsmIntCallRuntime) \
|
||||
V(OptimizedCallRuntime) \
|
||||
V(OptimizedCallOptimized) \
|
||||
V(HandleCommonCall) \
|
||||
V(DebugPrint) \
|
||||
V(FatalPrint) \
|
||||
|
@ -341,7 +341,7 @@ GateRef CircuitBuilder::NewRuntimeCallGate(GateRef glue, GateRef target,
|
||||
inputs.push_back(arg);
|
||||
}
|
||||
OpCode opcode(OpCode::RUNTIME_CALL);
|
||||
const CallSignature *descriptor = RuntimeStubCSigns::Get(RTSTUB_ID(RuntimeCallTrampolineAot));
|
||||
const CallSignature *descriptor = RuntimeStubCSigns::Get(RTSTUB_ID(OptimizedCallRuntime));
|
||||
MachineType machineType = GetCallMachineTypeFromVariableType(descriptor->GetReturnType());
|
||||
GateType type = VariableType2GateType(descriptor->GetReturnType());
|
||||
// 2 : 2 means extra two input gates (target glue)
|
||||
@ -354,7 +354,7 @@ GateRef CircuitBuilder::CallRuntimeVariadic(GateRef glue, GateRef target, GateRe
|
||||
std::vector<GateRef> inputs {depend, target, glue};
|
||||
inputs.insert(inputs.end(), args.begin(), args.end());
|
||||
OpCode opcode(OpCode::RUNTIME_CALL);
|
||||
const CallSignature *descriptor = RuntimeStubCSigns::Get(RTSTUB_ID(RuntimeCallTrampolineAot));
|
||||
const CallSignature *descriptor = RuntimeStubCSigns::Get(RTSTUB_ID(OptimizedCallRuntime));
|
||||
MachineType machineType = GetCallMachineTypeFromVariableType(descriptor->GetReturnType());
|
||||
GateType type = VariableType2GateType(descriptor->GetReturnType());
|
||||
// 2 : 2 means extra two input gates (target glue)
|
||||
|
@ -466,7 +466,7 @@ void LLVMIRBuilder::VisitRuntimeCall(GateRef gate, const std::vector<GateRef> &i
|
||||
ASSERT(stubModule_ != nullptr);
|
||||
LLVMValueRef callee;
|
||||
LLVMValueRef rtoffset;
|
||||
LLVMTypeRef rtfuncType = stubModule_->GetFunctionType(RTSTUB_ID(RuntimeCallTrampolineAot) +
|
||||
LLVMTypeRef rtfuncType = stubModule_->GetFunctionType(RTSTUB_ID(OptimizedCallRuntime) +
|
||||
NOGC_RTSTUB_CSIGNS_BEGIN);
|
||||
LLVMTypeRef rtfuncTypePtr = LLVMPointerType(rtfuncType, 0);
|
||||
LLVMValueRef glue = gateToLLVMMaps_[inList[2]]; // 2 : 2 means skip two input gates (target glue)
|
||||
@ -475,12 +475,12 @@ void LLVMIRBuilder::VisitRuntimeCall(GateRef gate, const std::vector<GateRef> &i
|
||||
circuit_->GetFrameType() == FrameType::OPTIMIZED_ENTRY_FRAME) {
|
||||
rtoffset = LLVMConstInt(glue_type,
|
||||
JSThread::GlueData::GetRTInterfacesOffset(compCfg_->Is32Bit()) +
|
||||
(RTSTUB_ID(RuntimeCallTrampolineInterpreterAsm)) * slotSize_,
|
||||
(RTSTUB_ID(AsmIntCallRuntime)) * slotSize_,
|
||||
0);
|
||||
} else {
|
||||
rtoffset = LLVMConstInt(glue_type,
|
||||
JSThread::GlueData::GetRTInterfacesOffset(compCfg_->Is32Bit()) +
|
||||
(RTSTUB_ID(RuntimeCallTrampolineAot)) * slotSize_,
|
||||
(RTSTUB_ID(OptimizedCallRuntime)) * slotSize_,
|
||||
0);
|
||||
}
|
||||
LLVMValueRef rtbaseoffset = LLVMBuildAdd(builder_, glue, rtoffset, "");
|
||||
|
@ -94,17 +94,17 @@ HWTEST_F_L0(StubTest, FastAddTest)
|
||||
assembler.Run();
|
||||
// Testcase build and run
|
||||
auto stubAddr = reinterpret_cast<uintptr_t>(assembler.GetFuncPtrFromCompiledModule(function));
|
||||
JSTaggedType argv[2] = {JSTaggedValue(1).GetRawData(), JSTaggedValue(1).GetRawData()};
|
||||
JSTaggedType argV[2] = {JSTaggedValue(1).GetRawData(), JSTaggedValue(1).GetRawData()};
|
||||
JSTaggedValue resA(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
argv[0] = JSTaggedValue(2).GetRawData();
|
||||
argv[1] = JSTaggedValue(2).GetRawData();
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argV, stubAddr));
|
||||
argV[0] = JSTaggedValue(2).GetRawData();
|
||||
argV[1] = JSTaggedValue(2).GetRawData();
|
||||
JSTaggedValue resB(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
argv[0] = JSTaggedValue(11).GetRawData();
|
||||
argv[1] = JSTaggedValue(11).GetRawData();
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argV, stubAddr));
|
||||
argV[0] = JSTaggedValue(11).GetRawData();
|
||||
argV[1] = JSTaggedValue(11).GetRawData();
|
||||
JSTaggedValue resC(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argV, stubAddr));
|
||||
LOG_ECMA(INFO) << "res for FastAdd(1, 1) = " << resA.GetNumber();
|
||||
LOG_ECMA(INFO) << "res for FastAdd(2, 2) = " << resB.GetNumber();
|
||||
LOG_ECMA(INFO) << "res for FastAdd(11, 11) = " << resC.GetNumber();
|
||||
@ -113,10 +113,10 @@ HWTEST_F_L0(StubTest, FastAddTest)
|
||||
EXPECT_EQ(resC.GetNumber(), JSTaggedValue(22).GetNumber());
|
||||
int x1 = 2147483647;
|
||||
int y1 = 15;
|
||||
argv[0] = JSTaggedValue(x1).GetRawData();
|
||||
argv[1] = JSTaggedValue(y1).GetRawData();
|
||||
argV[0] = JSTaggedValue(x1).GetRawData();
|
||||
argV[1] = JSTaggedValue(y1).GetRawData();
|
||||
JSTaggedValue resG(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argV, stubAddr));
|
||||
auto expectedG = FastRuntimeStub::FastAdd(JSTaggedValue(x1), JSTaggedValue(y1));
|
||||
EXPECT_EQ(resG, expectedG);
|
||||
}
|
||||
@ -139,15 +139,15 @@ HWTEST_F_L0(StubTest, FastSubTest)
|
||||
auto stubAddr = reinterpret_cast<uintptr_t>(assembler.GetFuncPtrFromCompiledModule(function));
|
||||
JSTaggedType argv[2] = {JSTaggedValue(2).GetRawData(), JSTaggedValue(1).GetRawData()};
|
||||
JSTaggedValue resA(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
argv[0] = JSTaggedValue(7).GetRawData(); // 7 : test case
|
||||
argv[1] = JSTaggedValue(2).GetRawData(); // 2 : test case
|
||||
JSTaggedValue resB(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
argv[0] = JSTaggedValue(11).GetRawData(); // 11 : test case
|
||||
argv[1] = JSTaggedValue(11).GetRawData(); // 11 : test case
|
||||
JSTaggedValue resC(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
LOG_ECMA(INFO) << "res for FastSub(2, 1) = " << resA.GetNumber();
|
||||
LOG_ECMA(INFO) << "res for FastSub(7, 2) = " << resB.GetNumber();
|
||||
LOG_ECMA(INFO) << "res for FastSub(11, 11) = " << resC.GetNumber();
|
||||
@ -176,15 +176,15 @@ HWTEST_F_L0(StubTest, FastMulTest)
|
||||
auto stubAddr = reinterpret_cast<uintptr_t>(assembler.GetFuncPtrFromCompiledModule(function));
|
||||
JSTaggedType argv[2] = {JSTaggedValue(-2).GetRawData(), JSTaggedValue(1).GetRawData()};
|
||||
JSTaggedValue resA(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
argv[0] = JSTaggedValue(-7).GetRawData(); // -7 : test case
|
||||
argv[1] = JSTaggedValue(-2).GetRawData(); // -2 : test case
|
||||
JSTaggedValue resB(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
argv[0] = JSTaggedValue(11).GetRawData(); // 11 : test case
|
||||
argv[1] = JSTaggedValue(11).GetRawData(); // 11 : test case
|
||||
JSTaggedValue resC(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
LOG_ECMA(INFO) << "res for FastMul(-2, 1) = " << std::dec << resA.GetNumber();
|
||||
LOG_ECMA(INFO) << "res for FastMul(-7, -2) = " << std::dec << resB.GetNumber();
|
||||
LOG_ECMA(INFO) << "res for FastMul(11, 11) = " << std::dec << resC.GetNumber();
|
||||
@ -196,7 +196,7 @@ HWTEST_F_L0(StubTest, FastMulTest)
|
||||
argv[0] = JSTaggedValue(x).GetRawData(); // 11 : test case
|
||||
argv[1] = JSTaggedValue(y).GetRawData(); // 11 : test case
|
||||
JSTaggedValue resD(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
JSTaggedValue expectedD = FastRuntimeStub::FastMul(JSTaggedValue(x), JSTaggedValue(y));
|
||||
EXPECT_EQ(resD, expectedD);
|
||||
x = -1;
|
||||
@ -204,7 +204,7 @@ HWTEST_F_L0(StubTest, FastMulTest)
|
||||
argv[0] = JSTaggedValue(x).GetRawData();
|
||||
argv[1] = JSTaggedValue(y).GetRawData();
|
||||
JSTaggedValue resE(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
JSTaggedValue expectedE = FastRuntimeStub::FastMul(JSTaggedValue(x), JSTaggedValue(y));
|
||||
EXPECT_EQ(resE, expectedE);
|
||||
x = -1;
|
||||
@ -212,7 +212,7 @@ HWTEST_F_L0(StubTest, FastMulTest)
|
||||
argv[0] = JSTaggedValue(x).GetRawData();
|
||||
argv[1] = JSTaggedValue(y).GetRawData();
|
||||
JSTaggedValue resF(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
JSTaggedValue expectedF = FastRuntimeStub::FastMul(JSTaggedValue(x), JSTaggedValue(y));
|
||||
EXPECT_EQ(resF, expectedF);
|
||||
int x1 = 2147483647;
|
||||
@ -220,7 +220,7 @@ HWTEST_F_L0(StubTest, FastMulTest)
|
||||
argv[0] = JSTaggedValue(x1).GetRawData();
|
||||
argv[1] = JSTaggedValue(y1).GetRawData();
|
||||
JSTaggedValue resG(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
auto expectedG = FastRuntimeStub::FastMul(JSTaggedValue(x1), JSTaggedValue(y1));
|
||||
EXPECT_EQ(resG, expectedG);
|
||||
}
|
||||
@ -247,7 +247,7 @@ HWTEST_F_L0(StubTest, FastDivTest)
|
||||
LOG_ECMA(INFO) << "x1 = " << x1 << " y1 = " << y1;
|
||||
JSTaggedType argv[2] = {x1, y1};
|
||||
JSTaggedValue res1(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
LOG_ECMA(INFO) << "res for FastDiv(50, 25) = " << res1.GetRawData();
|
||||
auto expectedG1 = FastRuntimeStub::FastDiv(JSTaggedValue(x1), JSTaggedValue(y1));
|
||||
EXPECT_EQ(res1, expectedG1);
|
||||
@ -258,7 +258,7 @@ HWTEST_F_L0(StubTest, FastDivTest)
|
||||
argv[0] = x2;
|
||||
argv[1] = y2;
|
||||
JSTaggedValue res2(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
LOG_ECMA(INFO) << "res for FastDiv(base::NAN_VALUE, 0) = " << res2.GetRawData();
|
||||
auto expectedG2 = FastRuntimeStub::FastDiv(JSTaggedValue(x2), JSTaggedValue(y2));
|
||||
EXPECT_EQ(res2, expectedG2);
|
||||
@ -270,7 +270,7 @@ HWTEST_F_L0(StubTest, FastDivTest)
|
||||
argv[1] = y3;
|
||||
LOG_ECMA(INFO) << "x2 = " << x3 << " y2 = " << y3;
|
||||
JSTaggedValue res3(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
LOG_ECMA(INFO) << "res for FastDiv(7, 0) = " << res3.GetRawData();
|
||||
auto expectedG3 = FastRuntimeStub::FastDiv(JSTaggedValue(x3), JSTaggedValue(y3));
|
||||
EXPECT_EQ(res3, expectedG3);
|
||||
@ -599,8 +599,8 @@ HWTEST_F_L0(StubTest, JSEntryTest)
|
||||
LLVMTypeRef funcType = LLVMFunctionType(llvmI32, argsTy.data(), argsTy.size(), 1);
|
||||
LLVMValueRef runtimeFunc1 = LLVMAddFunction(module, "RuntimeFunc1", funcType);
|
||||
|
||||
std::vector<LLVMValueRef> argvalue = {value};
|
||||
LLVMBuildCall(builder, runtimeFunc1, argvalue.data(), 1, "");
|
||||
std::vector<LLVMValueRef> argValue = {value};
|
||||
LLVMBuildCall(builder, runtimeFunc1, argValue.data(), 1, "");
|
||||
LLVMValueRef retVal = LLVMConstInt(LLVMInt64Type(), 1, false);
|
||||
LLVMBuildRet(builder, retVal);
|
||||
|
||||
@ -629,9 +629,9 @@ HWTEST_F_L0(StubTest, JSEntryTest)
|
||||
|
||||
LLVMValueRef stub3 = LLVMAddFunction(module, "stub3", LLVMFunctionType(LLVMInt64Type(), paramTys0, 1, 0));
|
||||
/* stub2 call stub3 */
|
||||
argvalue = {value2};
|
||||
argValue = {value2};
|
||||
|
||||
LLVMBuildCall(builder, stub3, argvalue.data(), 1, "");
|
||||
LLVMBuildCall(builder, stub3, argValue.data(), 1, "");
|
||||
retVal = LLVMConstInt(LLVMInt64Type(), 2, false);
|
||||
LLVMBuildRet(builder, retVal);
|
||||
|
||||
@ -652,8 +652,8 @@ HWTEST_F_L0(StubTest, JSEntryTest)
|
||||
*/
|
||||
/* stub2 call RuntimeFunc2 */
|
||||
LLVMValueRef runtimeFunc2 = LLVMAddFunction(module, "RuntimeFunc2", funcType);
|
||||
argvalue = {value3};
|
||||
LLVMBuildCall(builder, runtimeFunc2, argvalue.data(), 1, "");
|
||||
argValue = {value3};
|
||||
LLVMBuildCall(builder, runtimeFunc2, argValue.data(), 1, "");
|
||||
retVal = LLVMConstInt(LLVMInt64Type(), 3, false);
|
||||
LLVMBuildRet(builder, retVal);
|
||||
char *error = nullptr;
|
||||
@ -682,7 +682,7 @@ HWTEST_F_L0(StubTest, JSEntryTest)
|
||||
}
|
||||
|
||||
/*
|
||||
verify modify llvm prologue : call main ok means don't destroy c abi
|
||||
verify modify llvm prologue : call main ok means don't destory c abi
|
||||
test:
|
||||
main push rbp
|
||||
push type
|
||||
@ -796,9 +796,9 @@ HWTEST_F_L0(StubTest, CEntryFp)
|
||||
LLVMTypeRef funcType = LLVMFunctionType(llvmI64, argsTy.data(), argsTy.size(), 1);
|
||||
LLVMValueRef runTimeFunc = LLVMAddFunction(module, "RuntimeFunc", funcType);
|
||||
|
||||
std::vector<LLVMValueRef> argvalue = {value};
|
||||
std::vector<LLVMValueRef> argValue = {value};
|
||||
std::cout << std::endl;
|
||||
LLVMValueRef retVal = LLVMBuildCall(builder, runTimeFunc, argvalue.data(), 1, "");
|
||||
LLVMValueRef retVal = LLVMBuildCall(builder, runTimeFunc, argValue.data(), 1, "");
|
||||
LLVMBuildRet(builder, retVal);
|
||||
char *error = nullptr;
|
||||
LLVMVerifyModule(module, LLVMAbortProcessAction, &error);
|
||||
@ -1127,7 +1127,7 @@ HWTEST_F_L0(StubTest, FastTypeOfTest)
|
||||
// obj is JSTaggedValue::VALUE_TRUE
|
||||
JSTaggedType argv[1] = {JSTaggedValue::True().GetRawData()};
|
||||
JSTaggedValue resultVal(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, stubAddr, argv[0]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, argv, stubAddr));
|
||||
JSTaggedValue expectResult = FastRuntimeStub::FastTypeOf(thread, JSTaggedValue::True());
|
||||
EXPECT_EQ(resultVal, globalConst->GetBooleanString());
|
||||
EXPECT_EQ(resultVal, expectResult);
|
||||
@ -1135,7 +1135,7 @@ HWTEST_F_L0(StubTest, FastTypeOfTest)
|
||||
// obj is JSTaggedValue::VALUE_FALSE
|
||||
argv[0] = JSTaggedValue::False().GetRawData();
|
||||
JSTaggedValue resultVal2(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, stubAddr, argv[0]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, argv, stubAddr));
|
||||
JSTaggedValue expectResult2 = FastRuntimeStub::FastTypeOf(thread, JSTaggedValue::False());
|
||||
EXPECT_EQ(resultVal2, globalConst->GetBooleanString());
|
||||
EXPECT_EQ(resultVal2, expectResult2);
|
||||
@ -1143,7 +1143,7 @@ HWTEST_F_L0(StubTest, FastTypeOfTest)
|
||||
// obj is JSTaggedValue::VALUE_NULL
|
||||
argv[0] = JSTaggedValue::Null().GetRawData();
|
||||
JSTaggedValue resultVal3(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, stubAddr, argv[0]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, argv, stubAddr));
|
||||
JSTaggedValue expectResult3 = FastRuntimeStub::FastTypeOf(thread, JSTaggedValue::Null());
|
||||
EXPECT_EQ(resultVal3, globalConst->GetObjectString());
|
||||
EXPECT_EQ(resultVal3, expectResult3);
|
||||
@ -1151,7 +1151,7 @@ HWTEST_F_L0(StubTest, FastTypeOfTest)
|
||||
// obj is JSTaggedValue::VALUE_UNDEFINED
|
||||
argv[0] = JSTaggedValue::Undefined().GetRawData();
|
||||
JSTaggedValue resultVal4(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, stubAddr, argv[0]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, argv, stubAddr));
|
||||
JSTaggedValue expectResult4 = FastRuntimeStub::FastTypeOf(thread, JSTaggedValue::Undefined());
|
||||
EXPECT_EQ(resultVal4, globalConst->GetUndefinedString());
|
||||
EXPECT_EQ(resultVal4, expectResult4);
|
||||
@ -1159,7 +1159,7 @@ HWTEST_F_L0(StubTest, FastTypeOfTest)
|
||||
// obj is IsNumber
|
||||
argv[0] = JSTaggedValue(5).GetRawData();
|
||||
JSTaggedValue resultVal5(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, stubAddr, argv[0]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, argv, stubAddr));
|
||||
JSTaggedValue expectResult5 = FastRuntimeStub::FastTypeOf(thread, JSTaggedValue(5));
|
||||
EXPECT_EQ(resultVal5, globalConst->GetNumberString());
|
||||
EXPECT_EQ(resultVal5, expectResult5);
|
||||
@ -1171,7 +1171,7 @@ HWTEST_F_L0(StubTest, FastTypeOfTest)
|
||||
JSTaggedValue expectResult6 = FastRuntimeStub::FastTypeOf(thread, str1.GetTaggedValue());
|
||||
argv[0] = str2.GetTaggedValue().GetRawData();
|
||||
JSTaggedValue resultVal6(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, stubAddr, argv[0]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, argv, stubAddr));
|
||||
EXPECT_EQ(resultVal6, globalConst->GetStringString());
|
||||
EXPECT_EQ(resultVal6, expectResult6);
|
||||
|
||||
@ -1182,7 +1182,7 @@ HWTEST_F_L0(StubTest, FastTypeOfTest)
|
||||
|
||||
argv[0] = symbol.GetRawData();
|
||||
JSTaggedValue resultVal7(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, stubAddr, argv[0]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, argv, stubAddr));
|
||||
EXPECT_EQ(resultVal7, globalConst->GetSymbolString());
|
||||
EXPECT_EQ(resultVal7, expectResult7);
|
||||
|
||||
@ -1192,7 +1192,7 @@ HWTEST_F_L0(StubTest, FastTypeOfTest)
|
||||
JSTaggedValue expectResult8= FastRuntimeStub::FastTypeOf(thread, resolveCallable.GetTaggedValue());
|
||||
argv[0] = resolveCallable.GetTaggedValue().GetRawData();
|
||||
JSTaggedValue resultVal8(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, stubAddr, argv[0]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, argv, stubAddr));
|
||||
EXPECT_EQ(resultVal8, globalConst->GetFunctionString());
|
||||
EXPECT_EQ(resultVal8, expectResult8);
|
||||
|
||||
@ -1201,7 +1201,7 @@ HWTEST_F_L0(StubTest, FastTypeOfTest)
|
||||
JSTaggedValue expectResult9= FastRuntimeStub::FastTypeOf(thread, object.GetTaggedValue());
|
||||
argv[0] = object.GetTaggedValue().GetRawData();
|
||||
JSTaggedValue resultVal9(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, stubAddr, argv[0]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 1, 1, argv, stubAddr));
|
||||
EXPECT_EQ(resultVal9, globalConst->GetObjectString());
|
||||
EXPECT_EQ(resultVal9, expectResult9);
|
||||
}
|
||||
@ -1224,7 +1224,7 @@ HWTEST_F_L0(StubTest, FastEqualTest)
|
||||
// test for 1 == 1
|
||||
JSTaggedType argv[2] = {JSTaggedValue(1).GetRawData(), JSTaggedValue(1).GetRawData()};
|
||||
JSTaggedValue resA(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
auto expectA = FastRuntimeStub::FastEqual(JSTaggedValue(1), JSTaggedValue(1));
|
||||
EXPECT_EQ(resA, expectA);
|
||||
|
||||
@ -1233,7 +1233,7 @@ HWTEST_F_L0(StubTest, FastEqualTest)
|
||||
argv[0] = JSTaggedValue(nan).GetRawData();
|
||||
argv[1] = JSTaggedValue(nan).GetRawData();
|
||||
JSTaggedValue resB(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
auto expectB = FastRuntimeStub::FastEqual(JSTaggedValue(nan), JSTaggedValue(nan));
|
||||
EXPECT_EQ(resB, expectB);
|
||||
|
||||
@ -1241,7 +1241,7 @@ HWTEST_F_L0(StubTest, FastEqualTest)
|
||||
argv[0] = JSTaggedValue::Undefined().GetRawData();
|
||||
argv[1] = JSTaggedValue::Null().GetRawData();
|
||||
JSTaggedValue resC(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
auto expectC = FastRuntimeStub::FastEqual(JSTaggedValue::Undefined(), JSTaggedValue::Null());
|
||||
EXPECT_EQ(resC, expectC);
|
||||
|
||||
@ -1251,7 +1251,7 @@ HWTEST_F_L0(StubTest, FastEqualTest)
|
||||
argv[0] = str.GetTaggedValue().GetRawData();
|
||||
argv[1] = JSTaggedValue::Undefined().GetRawData();
|
||||
JSTaggedValue resD(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
auto expectD = FastRuntimeStub::FastEqual(str.GetTaggedValue(), JSTaggedValue::Undefined());
|
||||
EXPECT_EQ(resD, expectD);
|
||||
|
||||
@ -1259,7 +1259,7 @@ HWTEST_F_L0(StubTest, FastEqualTest)
|
||||
argv[0] = JSTaggedValue::True().GetRawData();
|
||||
argv[1] = JSTaggedValue::Hole().GetRawData();
|
||||
JSTaggedValue resE(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
auto expectE = FastRuntimeStub::FastEqual(JSTaggedValue::True(), JSTaggedValue::Hole());
|
||||
EXPECT_EQ(resE, expectE);
|
||||
|
||||
@ -1267,7 +1267,7 @@ HWTEST_F_L0(StubTest, FastEqualTest)
|
||||
argv[0] = str.GetTaggedValue().GetRawData();
|
||||
argv[1] = str.GetTaggedValue().GetRawData();
|
||||
JSTaggedValue resF(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
auto expectF = FastRuntimeStub::FastEqual(str.GetTaggedValue(), str.GetTaggedValue());
|
||||
EXPECT_EQ(resF, expectF);
|
||||
|
||||
@ -1275,7 +1275,7 @@ HWTEST_F_L0(StubTest, FastEqualTest)
|
||||
argv[0] = JSTaggedValue(5.2).GetRawData();
|
||||
argv[1] = JSTaggedValue(5.2).GetRawData();
|
||||
JSTaggedValue resG(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
auto expectG = FastRuntimeStub::FastEqual(JSTaggedValue(5.2), JSTaggedValue(5.2));
|
||||
EXPECT_EQ(resG, expectG);
|
||||
|
||||
@ -1283,7 +1283,7 @@ HWTEST_F_L0(StubTest, FastEqualTest)
|
||||
argv[0] = JSTaggedValue::False().GetRawData();
|
||||
argv[1] = JSTaggedValue::False().GetRawData();
|
||||
JSTaggedValue resH(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
auto expectH = FastRuntimeStub::FastEqual(JSTaggedValue::False(), JSTaggedValue::False());
|
||||
EXPECT_EQ(resH, expectH);
|
||||
|
||||
@ -1295,7 +1295,7 @@ HWTEST_F_L0(StubTest, FastEqualTest)
|
||||
argv[0] = obj1.GetTaggedValue().GetRawData();
|
||||
argv[1] = obj2.GetTaggedValue().GetRawData();
|
||||
JSTaggedValue resI(JSFunctionEntry(thread->GetGlueAddr(),
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, stubAddr, argv[0], argv[1]));
|
||||
reinterpret_cast<uintptr_t>(thread->GetCurrentSPFrame()), 2, 2, argv, stubAddr));
|
||||
auto expectI = FastRuntimeStub::FastEqual(obj1.GetTaggedValue(), obj2.GetTaggedValue());
|
||||
EXPECT_EQ(resI, expectI);
|
||||
}
|
||||
|
@ -30,9 +30,9 @@ class GlobalEnv;
|
||||
class JSthread;
|
||||
class JSFunction;
|
||||
class ObjectFactory;
|
||||
extern "C" JSTaggedType RuntimeCallTrampolineAot(uintptr_t glue, uint64_t runtime_id, uint64_t argc, ...);
|
||||
extern "C" JSTaggedType RuntimeCallTrampolineInterpreterAsm(uintptr_t glue, uint64_t runtime_id, uint64_t argc, ...);
|
||||
extern "C" JSTaggedType AotCallAotTrampoline(uintptr_t glue, uint32_t expectedNumArgs,
|
||||
extern "C" JSTaggedType OptimizedCallRuntime(uintptr_t glue, uint64_t runtime_id, uint64_t argc, ...);
|
||||
extern "C" JSTaggedType AsmIntCallRuntime(uintptr_t glue, uint64_t runtime_id, uint64_t argc, ...);
|
||||
extern "C" JSTaggedType OptimizedCallOptimized(uintptr_t glue, uint32_t expectedNumArgs,
|
||||
uint32_t actualNumArgs, uintptr_t codeAddr, ...);
|
||||
extern "C" void HandleCommonCall(uintptr_t glue, uint64_t callType, uintptr_t sp, uint64_t funcReg,
|
||||
uint64_t actualArgc, ...);
|
||||
@ -42,9 +42,9 @@ extern "C" void HandleCommonCall(uintptr_t glue, uint64_t callType, uintptr_t sp
|
||||
V(InsertOldToNewRememberedSet, 3) \
|
||||
V(MarkingBarrier, 5) \
|
||||
V(DoubleToInt, 1) \
|
||||
V(RuntimeCallTrampolineAot, 3) \
|
||||
V(AotCallAotTrampoline, 4) \
|
||||
V(RuntimeCallTrampolineInterpreterAsm, 3) \
|
||||
V(OptimizedCallRuntime, 3) \
|
||||
V(OptimizedCallOptimized, 4) \
|
||||
V(AsmIntCallRuntime, 3) \
|
||||
V(HandleCommonCall, 5)
|
||||
|
||||
#define RUNTIME_STUB_WITH_GC_LIST(V) \
|
||||
|
@ -17,14 +17,14 @@
|
||||
.global JSFunctionEntry
|
||||
.type JSFunctionEntry, %function
|
||||
|
||||
.global RuntimeCallTrampolineAot
|
||||
.type RuntimeCallTrampolineAot, %function
|
||||
.global OptimizedCallRuntime
|
||||
.type OptimizedCallRuntime, %function
|
||||
|
||||
.global RuntimeCallTrampolineInterpreterAsm
|
||||
.type RuntimeCallTrampolineInterpreterAsm, %function
|
||||
.global AsmIntCallRuntime
|
||||
.type AsmIntCallRuntime, %function
|
||||
|
||||
.global AotCallAotTrampoline
|
||||
.type AotCallAotTrampoline, %function
|
||||
.global OptimizedCallOptimized
|
||||
.type OptimizedCallOptimized, %function
|
||||
|
||||
.global HandleCommonCall
|
||||
.type HandleCommonCall, %function
|
||||
@ -62,16 +62,14 @@
|
||||
#define ARGS_STACK_TOP_TO_FP_OFFSET (CALLEESAVE_REGS_SIZE + 2 * SLOT_SIZE)
|
||||
|
||||
// uint64_t JSFunctionEntry(uintptr_t glue, uintptr_t prevFp, uint32_t expectedNumArgs,
|
||||
// uint32_t actualNumArgs, uintptr_t codeAddr, ...);
|
||||
// uint32_t actualNumArgs, const JSTaggedType argV[], uintptr_t codeAddr);
|
||||
// Input:
|
||||
// %x0 - glue
|
||||
// %x1 - prevFp
|
||||
// %x2 - expectedNumArgs
|
||||
// %x3 - actualNumArgs
|
||||
// %x4 - codeAddr
|
||||
// %x5 - argv[0]
|
||||
// %x6 - argv[1]
|
||||
// %x7 - argv[2]
|
||||
// %x4 - argV
|
||||
// %x5 - codeAddr
|
||||
// construct Entry Frame
|
||||
// +--------------------------+
|
||||
// | returnaddress | ^
|
||||
@ -112,47 +110,20 @@ JSFunctionEntry:
|
||||
cmp w19, w3
|
||||
csel w8, w19, w3, lo
|
||||
cbz w8, .InvokeCompiledJSFunction
|
||||
cmp w8, #1
|
||||
b.ne .MoreThanOneArgv
|
||||
str x5, [sp, #-8]!
|
||||
b .CopyArgvEnd
|
||||
|
||||
.MoreThanOneArgv:
|
||||
cmp w8, #2
|
||||
b.ne .MoreThanTwoArgv
|
||||
str x6, [sp, #-8]!
|
||||
str x5, [sp, #-8]!
|
||||
b .CopyArgvEnd
|
||||
|
||||
.MoreThanTwoArgv:
|
||||
cmp w8, #3
|
||||
b.ne .MoreThanThreeArgv
|
||||
str x7, [sp, #-8]!
|
||||
str x6, [sp, #-8]!
|
||||
str x5, [sp, #-8]!
|
||||
b .CopyArgvEnd
|
||||
|
||||
.MoreThanThreeArgv:
|
||||
subs w8, w8, #3
|
||||
add x9, x29, #ARGS_STACK_TOP_TO_FP_OFFSET
|
||||
sub w9, w8, #1 // =1
|
||||
add x9, x4, w9, uxtw #3
|
||||
.LCopyArgLoop:
|
||||
ldr x10, [x9], #-8
|
||||
subs w8, w8, #1 // =1
|
||||
str x10, [sp, #-8]!
|
||||
|
||||
b.ne .LCopyArgLoop
|
||||
str x7, [sp, #-8]!
|
||||
str x6, [sp, #-8]!
|
||||
str x5, [sp, #-8]!
|
||||
|
||||
.CopyArgvEnd:
|
||||
b .InvokeCompiledJSFunction
|
||||
|
||||
// Input:
|
||||
// %x0 - glue
|
||||
// argv push stack
|
||||
.InvokeCompiledJSFunction:
|
||||
mov x2, x4
|
||||
mov x2, x5
|
||||
blr x2
|
||||
|
||||
// pop argv
|
||||
@ -207,7 +178,7 @@ JSFunctionEntry:
|
||||
// current sp - 8: type
|
||||
// current sp - 16: callee save x19
|
||||
|
||||
RuntimeCallTrampolineAot:
|
||||
OptimizedCallRuntime:
|
||||
stp x29, x30, [sp, #-16]! // save register for fp, rip
|
||||
mov x29, sp // set frame pointer = callsiteFp
|
||||
str x29, [x0, #ASM_GLUE_CURRENT_FRAME_OFFSET] // save to thread->currentFrame_
|
||||
@ -233,7 +204,7 @@ RuntimeCallTrampolineAot:
|
||||
ldp x29, x30, [sp], #16
|
||||
ret
|
||||
|
||||
RuntimeCallTrampolineInterpreterAsm:
|
||||
AsmIntCallRuntime:
|
||||
str x30, [sp, #-8] // save register rip
|
||||
add sp, sp, #-16
|
||||
str x19, [sp, #-16] // callee save register
|
||||
@ -261,7 +232,7 @@ RuntimeCallTrampolineInterpreterAsm:
|
||||
ret
|
||||
|
||||
|
||||
// extern "C" JSTaggedType AotCallAotTrampoline(uintptr_t glue, uint32_t expectedNumArgs,
|
||||
// extern "C" JSTaggedType OptimizedCallOptimized(uintptr_t glue, uint32_t expectedNumArgs,
|
||||
// uint32_t actualNumArgs, uintptr_t codeAddr, ...)
|
||||
// Input:
|
||||
// %x0 - glue
|
||||
@ -282,7 +253,7 @@ RuntimeCallTrampolineInterpreterAsm:
|
||||
// ...........................
|
||||
// sp[- 8(N - 1)] - arg[0]
|
||||
|
||||
AotCallAotTrampoline:
|
||||
OptimizedCallOptimized:
|
||||
PUSH_CALLEE_SAVED_REGS
|
||||
|
||||
mov x20, x0
|
||||
|
@ -18,14 +18,14 @@
|
||||
.global JSFunctionEntry
|
||||
.type JSFunctionEntry, %function
|
||||
|
||||
.global RuntimeCallTrampolineAot
|
||||
.type RuntimeCallTrampolineAot, %function
|
||||
.global OptimizedCallRuntime
|
||||
.type OptimizedCallRuntime, %function
|
||||
|
||||
.global RuntimeCallTrampolineInterpreterAsm
|
||||
.type RuntimeCallTrampolineInterpreterAsm, %function
|
||||
.global AsmIntCallRuntime
|
||||
.type AsmIntCallRuntime, %function
|
||||
|
||||
.global AotCallAotTrampoline
|
||||
.type AotCallAotTrampoline, %function
|
||||
.global OptimizedCallOptimized
|
||||
.type OptimizedCallOptimized, %function
|
||||
|
||||
.global HandleCommonCall
|
||||
.type HandleCommonCall, %function
|
||||
@ -59,29 +59,14 @@
|
||||
#define ARGS_STACK_TOP_TO_FP_OFFSET (CALLEESAVE_REGS_SIZE + CALLER_SAVE_LR_SIZE)
|
||||
|
||||
// uint64_t JSFunctionEntry(uintptr_t glue, uintptr_t prevFp, uint32_t expectedNumArgs,
|
||||
// uint32_t actualNumArgs, uintptr_t codeAddr, ...);
|
||||
// uint32_t actualNumArgs, const JSTaggedType argV[], uintptr_t codeAddr);
|
||||
// Input:
|
||||
// %rdi - glue
|
||||
// %rsi - prevFp
|
||||
// %rdx - expectedNumArgs
|
||||
// %ecx - actualNumArgs
|
||||
// %r8 - codeAddr
|
||||
// %r9 - argv[0]
|
||||
// sp[0 * 8] - argv[1]
|
||||
// sp[1 * 8] - argv[2]
|
||||
// sp[2 * 8] - argv[3]
|
||||
// .....
|
||||
// sp[(N -1) * 8] - argv[N - 1]
|
||||
// Output:
|
||||
// stack as followsn from high address to lowAdress
|
||||
// sp - argv[N - 1]
|
||||
// sp[-8] - argv[N -2]
|
||||
// ...........................
|
||||
// sp[- 8(N - 1)] - arg[0]
|
||||
// sp[-8(N)] - this
|
||||
// sp[-8(N+1)] - newTarget
|
||||
// sp[-8(N + 2)] - callTarget
|
||||
|
||||
// %r8 - argV
|
||||
// %r9 - codeAddr
|
||||
JSFunctionEntry:
|
||||
PUSH_GENERAL_REGS
|
||||
// construct the frame
|
||||
@ -116,29 +101,16 @@ JSFunctionEntry:
|
||||
cmovbe %ebx, %ecx
|
||||
movl %ecx, %eax
|
||||
|
||||
// argV[0] - r9
|
||||
addq $-1, %rax
|
||||
cmpq $0, %rax
|
||||
jbe .LCopyLoopEnd
|
||||
|
||||
// PUSH_GENERAL_REGS and return address alignment
|
||||
movq %rbp, %r15
|
||||
addq $FP_SIZE, %r15
|
||||
addq $ARGS_STACK_TOP_TO_FP_OFFSET, %r15
|
||||
|
||||
.LCopyLoop:
|
||||
movq -8(%r15, %rax, 8), %rcx
|
||||
movq -8(%r8, %rax, 8), %rcx
|
||||
pushq %rcx
|
||||
|
||||
addq $-1, %rax
|
||||
jne .LCopyLoop
|
||||
|
||||
.LCopyLoopEnd:
|
||||
// argV[0]
|
||||
pushq %r9
|
||||
movq %rdi, %rax // move glue to rax
|
||||
call *%r8 // then call jsFunction
|
||||
leaq (,%r14,8), %rcx
|
||||
call *%r9 // then call jsFunction
|
||||
leaq (,%r14,8), %rcx // todo:: fixed for 3 extra arguments
|
||||
addq %rcx, %rsp
|
||||
|
||||
testb $1, %r14b // stack 16bytes align check
|
||||
@ -155,7 +127,7 @@ JSFunctionEntry:
|
||||
ret
|
||||
|
||||
|
||||
// uint64_t AotCallAotTrampoline(uintptr_t glue, uint32_t expectedNumArgs,
|
||||
// uint64_t OptimizedCallOptimized(uintptr_t glue, uint32_t expectedNumArgs,
|
||||
// uint32_t actualNumArgs, uintptr_t codeAddr, ...);
|
||||
// Input:
|
||||
// %rdi - glue
|
||||
@ -176,7 +148,7 @@ JSFunctionEntry:
|
||||
// ...........................
|
||||
// sp[- 8(N - 1)] - arg[0]
|
||||
|
||||
AotCallAotTrampoline:
|
||||
OptimizedCallOptimized:
|
||||
PUSH_GENERAL_REGS
|
||||
|
||||
// 16 bytes align check
|
||||
@ -286,7 +258,7 @@ AotCallAotTrampoline:
|
||||
// sp - 16: rbp <---------current rbp & current sp
|
||||
// current sp - 8: type
|
||||
|
||||
RuntimeCallTrampolineAot:
|
||||
OptimizedCallRuntime:
|
||||
pushq %rbp
|
||||
movq %rsp, %rbp // set frame pointer
|
||||
movq %rbp, ASM_GLUE_CURRENT_FRAME_OFFSET(%rax) // save to thread->currentFrame_
|
||||
@ -317,7 +289,7 @@ RuntimeCallTrampolineAot:
|
||||
popq %rbp
|
||||
ret
|
||||
|
||||
RuntimeCallTrampolineInterpreterAsm:
|
||||
AsmIntCallRuntime:
|
||||
pushq $0
|
||||
movq %rsp, ASM_GLUE_LEAVE_FRAME_OFFSET(%rax) // save to thread->leaveFrame_
|
||||
pushq $ASM_LEAVE_FRAME_TYPE
|
||||
|
@ -18,14 +18,14 @@
|
||||
.global JSFunctionEntry
|
||||
.type JSFunctionEntry, %function
|
||||
|
||||
.global RuntimeCallTrampolineAot
|
||||
.type RuntimeCallTrampolineAot, %function
|
||||
.global OptimizedCallRuntime
|
||||
.type OptimizedCallRuntime, %function
|
||||
|
||||
.global RuntimeCallTrampolineInterpreterAsm
|
||||
.type RuntimeCallTrampolineInterpreterAsm, %function
|
||||
.global AsmIntCallRuntime
|
||||
.type AsmIntCallRuntime, %function
|
||||
|
||||
.global AotCallAotTrampoline
|
||||
.type AotCallAotTrampoline, %function
|
||||
.global OptimizedCallOptimized
|
||||
.type OptimizedCallOptimized, %function
|
||||
|
||||
.global HandleCommonCall
|
||||
.type HandleCommonCall, %function
|
||||
@ -36,7 +36,7 @@
|
||||
#define ARGS_STACK_TOP_TO_FP_OFFSET (CALLEESAVE_REGS_SIZE + SLOT_SIZE)
|
||||
|
||||
// uint64_t JSFunctionEntry(uintptr_t glue, uintptr_t prevFp, uint32_t expectedNumArgs,
|
||||
// uint32_t actualNumArgs, uintptr_t codeAddr, ...);
|
||||
// uint32_t actualNumArgs, const JSTaggedType argV[], uintptr_t codeAddr);
|
||||
// Input:
|
||||
// %r0 - glue
|
||||
// %r1 - prevFp
|
||||
@ -72,14 +72,15 @@ JSFunctionEntry:
|
||||
rscs r5, r4, #0
|
||||
blo .LCopyExtraAument
|
||||
.LCopyArguments:
|
||||
ldr lr, [r11, #ARGS_STACK_TOP_TO_FP_OFFSET] // load js function code address
|
||||
add r4, r11, #ARGS_STACK_TOP_TO_FP_OFFSET
|
||||
add r4, r4, #SLOT_SIZE // skip argv[]
|
||||
ldr lr, [r4] // load js function code address
|
||||
cmp r8, r3
|
||||
movls r3, r8
|
||||
cmp r3, #0
|
||||
beq .LInvokeJSFunction
|
||||
|
||||
add r4, r11, #ARGS_STACK_TOP_TO_FP_OFFSET
|
||||
add r4, r4, #SLOT_SIZE // skip codeAddr,load argv[0] addr
|
||||
add r4, r11, #ARGS_STACK_TOP_TO_FP_OFFSET // argv[]
|
||||
add r5, r4, r3, lsl #3
|
||||
.LCopyLoop:
|
||||
sub r5, r5, #8
|
||||
@ -132,9 +133,9 @@ JSFunctionEntry:
|
||||
// | padding | v
|
||||
// +--------------------------+ ---
|
||||
|
||||
.global RuntimeCallTrampolineAot
|
||||
.type RuntimeCallTrampolineAot, %function
|
||||
RuntimeCallTrampolineAot:
|
||||
.global OptimizedCallRuntime
|
||||
.type OptimizedCallRuntime, %function
|
||||
OptimizedCallRuntime:
|
||||
push {r11, lr} // save register for fp, rip
|
||||
mov r11, sp // set frame pointer = callsiteFp
|
||||
str r11, [r0, #ASM_GLUE_CURRENT_FRAME_OFFSET] // save to thread->currentFrame_
|
||||
@ -161,9 +162,9 @@ RuntimeCallTrampolineAot:
|
||||
pop {r11, lr}
|
||||
bx lr
|
||||
|
||||
.global RuntimeCallTrampolineInterpreterAsm
|
||||
.type RuntimeCallTrampolineInterpreterAsm, %function
|
||||
RuntimeCallTrampolineInterpreterAsm:
|
||||
.global AsmIntCallRuntime
|
||||
.type AsmIntCallRuntime, %function
|
||||
AsmIntCallRuntime:
|
||||
add sp, sp, #-8
|
||||
str lr, [sp, #4]
|
||||
str sp, [r0, #ASM_GLUE_LEAVE_FRAME_OFFSET] // save to thread->currentFrame_
|
||||
@ -191,7 +192,7 @@ RuntimeCallTrampolineInterpreterAsm:
|
||||
bx lr
|
||||
|
||||
|
||||
//extern "C" JSTaggedType AotCallAotTrampoline(uintptr_t glue, uint32_t expectedNumArgs,
|
||||
//extern "C" JSTaggedType OptimizedCallOptimized(uintptr_t glue, uint32_t expectedNumArgs,
|
||||
// uint32_t actualNumArgs, uintptr_t codeAddr, ...)
|
||||
// Input:
|
||||
// %r0 - glue
|
||||
@ -199,9 +200,9 @@ RuntimeCallTrampolineInterpreterAsm:
|
||||
// %r2 - actualNumArgs
|
||||
// %r3 - codeAddr
|
||||
|
||||
.global AotCallAotTrampoline
|
||||
.type AotCallAotTrampoline, %function
|
||||
AotCallAotTrampoline:
|
||||
.global OptimizedCallOptimized
|
||||
.type OptimizedCallOptimized, %function
|
||||
OptimizedCallOptimized:
|
||||
push {r4, r5, r6, r7, r8, r9, r10, lr} // callee save
|
||||
|
||||
mov r8, r1 // save expected
|
||||
|
@ -22,8 +22,8 @@
|
||||
|
||||
namespace panda::ecmascript {
|
||||
extern "C" JSTaggedType JSFunctionEntry(uintptr_t glue, uintptr_t prevFp, uint32_t expectedNumArgs,
|
||||
uint32_t actualNumArgs, uintptr_t codeAddr, ...);
|
||||
extern "C" JSTaggedType AotCallAotTrampoline(uintptr_t glue, uint32_t expectedNumArgs,
|
||||
uint32_t actualNumArgs, const JSTaggedType argV[], uintptr_t codeAddr);
|
||||
extern "C" JSTaggedType OptimizedCallOptimized(uintptr_t glue, uint32_t expectedNumArgs,
|
||||
uint32_t actualNumArgs, uintptr_t codeAddr, ...);
|
||||
} // panda::ecmascript
|
||||
#endif // ECMASCRIPT_BRIDGE_H
|
||||
|
Loading…
Reference in New Issue
Block a user