- 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:
Christoph Oelckers 2018-11-18 10:02:31 +01:00
commit fe0a341e0c
4 changed files with 64 additions and 99 deletions

View file

@ -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();
}