- fixed register allocation for vector arguments to script functions.

- handle 2D and 3D vectors in SetReturn.
This commit is contained in:
Christoph Oelckers 2016-10-29 13:42:37 +02:00
parent 7209f9edd6
commit 4dc97a6ed0
3 changed files with 12 additions and 2 deletions

View file

@ -296,6 +296,12 @@ struct VMReturn
((double *)Location)[1] = val[1];
((double *)Location)[2] = val[2];
}
void SetVector2(const double val[2])
{
//assert(RegType == REGT_FLOAT);
((double *)Location)[0] = val[0];
((double *)Location)[1] = val[1];
}
void SetString(const FString &val)
{
assert(RegType == REGT_STRING);

View file

@ -702,7 +702,7 @@ void FFunctionBuildList::Build()
auto flags = item.Func->Variants[0].ArgFlags[i];
// this won't get resolved and won't get emitted. It is only needed so that the code generator can retrieve the necessary info about this argument to do its work.
auto local = new FxLocalVariableDeclaration(type, name, nullptr, flags, FScriptPosition());
local->RegNum = buildit.Registers[type->GetRegType()].Get(1);
local->RegNum = buildit.Registers[type->GetRegType()].Get(type->GetRegCount());
ctx.FunctionArgs.Push(local);
}

View file

@ -1808,10 +1808,14 @@ static void SetReturn(const VMRegisters &reg, VMFrame *frame, VMReturn *ret, VM_
assert(regnum + ((regtype & REGT_KONST) ? 2u : 0u) < frame->NumRegF);
src = &reg.f[regnum];
}
if (regtype & REGT_MULTIREG)
if (regtype & REGT_MULTIREG3)
{
ret->SetVector((double *)src);
}
else if (regtype & REGT_MULTIREG2)
{
ret->SetVector2((double *)src);
}
else
{
ret->SetFloat(*(double *)src);