- moved all code related to function calls into the helper class so that all future work on the calling convention is in one place only.
This commit is contained in:
parent
cbedcff559
commit
fe0a341e0c
4 changed files with 64 additions and 99 deletions
|
|
@ -931,7 +931,7 @@ void FFunctionBuildList::DumpJit()
|
|||
}
|
||||
|
||||
|
||||
void EmitterArray::AddParameter(VMFunctionBuilder *build, FxExpression *operand)
|
||||
void FunctionCallEmitter::AddParameter(VMFunctionBuilder *build, FxExpression *operand)
|
||||
{
|
||||
ExpEmit where = operand->Emit(build);
|
||||
|
||||
|
|
@ -958,7 +958,7 @@ void EmitterArray::AddParameter(VMFunctionBuilder *build, FxExpression *operand)
|
|||
});
|
||||
}
|
||||
|
||||
void EmitterArray::AddParameter(ExpEmit &emit, bool reference)
|
||||
void FunctionCallEmitter::AddParameter(ExpEmit &emit, bool reference)
|
||||
{
|
||||
numparams += emit.RegCount;
|
||||
emitters.push_back([=](VMFunctionBuilder *build) ->int
|
||||
|
|
@ -970,7 +970,7 @@ void EmitterArray::AddParameter(ExpEmit &emit, bool reference)
|
|||
});
|
||||
}
|
||||
|
||||
void EmitterArray::AddParameterPointerConst(void *konst)
|
||||
void FunctionCallEmitter::AddParameterPointerConst(void *konst)
|
||||
{
|
||||
numparams++;
|
||||
emitters.push_back([=](VMFunctionBuilder *build) ->int
|
||||
|
|
@ -980,7 +980,7 @@ void EmitterArray::AddParameterPointerConst(void *konst)
|
|||
});
|
||||
}
|
||||
|
||||
void EmitterArray::AddParameterPointer(int index, bool konst)
|
||||
void FunctionCallEmitter::AddParameterPointer(int index, bool konst)
|
||||
{
|
||||
numparams++;
|
||||
emitters.push_back([=](VMFunctionBuilder *build) ->int
|
||||
|
|
@ -990,7 +990,7 @@ void EmitterArray::AddParameterPointer(int index, bool konst)
|
|||
});
|
||||
}
|
||||
|
||||
void EmitterArray::AddParameterFloatConst(double konst)
|
||||
void FunctionCallEmitter::AddParameterFloatConst(double konst)
|
||||
{
|
||||
numparams++;
|
||||
emitters.push_back([=](VMFunctionBuilder *build) ->int
|
||||
|
|
@ -1000,7 +1000,7 @@ void EmitterArray::AddParameterFloatConst(double konst)
|
|||
});
|
||||
}
|
||||
|
||||
void EmitterArray::AddParameterIntConst(int konst)
|
||||
void FunctionCallEmitter::AddParameterIntConst(int konst)
|
||||
{
|
||||
numparams++;
|
||||
emitters.push_back([=](VMFunctionBuilder *build) ->int
|
||||
|
|
@ -1018,7 +1018,7 @@ void EmitterArray::AddParameterIntConst(int konst)
|
|||
});
|
||||
}
|
||||
|
||||
void EmitterArray::AddParameterStringConst(const FString &konst)
|
||||
void FunctionCallEmitter::AddParameterStringConst(const FString &konst)
|
||||
{
|
||||
numparams++;
|
||||
emitters.push_back([=](VMFunctionBuilder *build) ->int
|
||||
|
|
@ -1028,7 +1028,7 @@ void EmitterArray::AddParameterStringConst(const FString &konst)
|
|||
});
|
||||
}
|
||||
|
||||
int EmitterArray::EmitParameters(VMFunctionBuilder *build)
|
||||
ExpEmit FunctionCallEmitter::EmitCall(VMFunctionBuilder *build, TArray<ExpEmit> *ReturnRegs)
|
||||
{
|
||||
int paramcount = 0;
|
||||
for (auto &func : emitters)
|
||||
|
|
@ -1036,18 +1036,27 @@ int EmitterArray::EmitParameters(VMFunctionBuilder *build)
|
|||
paramcount += func(build);
|
||||
}
|
||||
assert(paramcount == numparams);
|
||||
return paramcount;
|
||||
}
|
||||
|
||||
if (virtualselfreg == -1)
|
||||
{
|
||||
build->Emit(OP_CALL_K, build->GetConstantAddress(target), paramcount, returns.Size());
|
||||
}
|
||||
else
|
||||
{
|
||||
ExpEmit funcreg(build, REGT_POINTER);
|
||||
|
||||
ExpEmit EmitterArray::EmitCall(VMFunctionBuilder *build)
|
||||
{
|
||||
int count = EmitParameters(build);
|
||||
build->Emit(OP_CALL_K, build->GetConstantAddress(target), count, returns.Size());
|
||||
if (returns.Size() == 0) return ExpEmit();
|
||||
build->Emit(OP_VTBL, funcreg.RegNum, virtualselfreg, target->VirtualIndex);
|
||||
build->Emit(OP_CALL, funcreg.RegNum, paramcount, returns.Size());
|
||||
}
|
||||
|
||||
ExpEmit out(build, returns[0]);
|
||||
build->Emit(OP_RESULT, 0, returns[0], out.RegNum);
|
||||
return out;
|
||||
assert(returns.Size() < 2 || ReturnRegs != nullptr);
|
||||
for (unsigned i = 0; i < returns.Size(); i++)
|
||||
{
|
||||
ExpEmit reg(build, returns[i].first, returns[i].second);
|
||||
build->Emit(OP_RESULT, 0, EncodeRegType(reg), reg.RegNum);
|
||||
if (ReturnRegs) ReturnRegs->Push(reg);
|
||||
else return reg;
|
||||
}
|
||||
return ExpEmit();
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue