Make sure to use the REGT_MULTIREG flags for opcodes that need it

This commit is contained in:
Leonard2 2016-10-30 06:17:37 +01:00
parent 8be7af41a9
commit 5643d6c692
2 changed files with 31 additions and 20 deletions

View file

@ -335,6 +335,30 @@ PPrototype *FxExpression::ReturnProto()
// //
//========================================================================== //==========================================================================
static int EncodeRegType(ExpEmit reg)
{
int regtype = reg.RegType;
if (reg.Konst)
{
regtype |= REGT_KONST;
}
else if (reg.RegCount == 2)
{
regtype |= REGT_MULTIREG2;
}
else if (reg.RegCount == 3)
{
regtype |= REGT_MULTIREG3;
}
return regtype;
}
//==========================================================================
//
//
//
//==========================================================================
static int EmitParameter(VMFunctionBuilder *build, FxExpression *operand, const FScriptPosition &pos) static int EmitParameter(VMFunctionBuilder *build, FxExpression *operand, const FScriptPosition &pos)
{ {
ExpEmit where = operand->Emit(build); ExpEmit where = operand->Emit(build);
@ -347,20 +371,7 @@ static int EmitParameter(VMFunctionBuilder *build, FxExpression *operand, const
} }
else else
{ {
int regtype = where.RegType; build->Emit(OP_PARAM, 0, EncodeRegType(where), where.RegNum);
if (where.Konst)
{
regtype |= REGT_KONST;
}
else if (where.RegCount == 2)
{
regtype |= REGT_MULTIREG2;
}
else if (where.RegCount == 3)
{
regtype |= REGT_MULTIREG3;
}
build->Emit(OP_PARAM, 0, regtype, where.RegNum);
where.Free(build); where.Free(build);
return where.RegCount; return where.RegCount;
} }
@ -6215,9 +6226,9 @@ ExpEmit FxVMFunctionCall::Emit(VMFunctionBuilder *build)
} }
else if (vmfunc->Proto->ReturnTypes.Size() > 0) else if (vmfunc->Proto->ReturnTypes.Size() > 0)
{ // Call, expecting one result { // Call, expecting one result
ExpEmit reg(build, vmfunc->Proto->ReturnTypes[0]->GetRegType()); ExpEmit reg(build, vmfunc->Proto->ReturnTypes[0]->GetRegType(), vmfunc->Proto->ReturnTypes[0]->GetRegCount());
build->Emit(OP_CALL_K, funcaddr, count, 1); build->Emit(OP_CALL_K, funcaddr, count, 1);
build->Emit(OP_RESULT, 0, reg.RegType, reg.RegNum); build->Emit(OP_RESULT, 0, EncodeRegType(reg), reg.RegNum);
return reg; return reg;
} }
else else
@ -6255,7 +6266,7 @@ bool FxVMFunctionCall::CheckEmitCast(VMFunctionBuilder *build, bool returnit, Ex
else else
{ {
ExpEmit where = arg->Emit(build); ExpEmit where = arg->Emit(build);
build->Emit(OP_RET, RET_FINAL, where.RegType | (where.Konst ? REGT_KONST : 0), where.RegNum); build->Emit(OP_RET, RET_FINAL, EncodeRegType(where), where.RegNum);
where.Free(build); where.Free(build);
} }
reg = ExpEmit(); reg = ExpEmit();
@ -7319,7 +7330,7 @@ ExpEmit FxReturnStatement::Emit(VMFunctionBuilder *build)
} }
else else
{ {
build->Emit(OP_RET, RET_FINAL, out.RegType | (out.Konst ? REGT_KONST : 0), out.RegNum); build->Emit(OP_RET, RET_FINAL, EncodeRegType(out), out.RegNum);
} }
} }
} }

View file

@ -291,14 +291,14 @@ struct VMReturn
} }
void SetVector(const double val[3]) void SetVector(const double val[3])
{ {
//assert(RegType == REGT_FLOAT); assert(RegType == (REGT_FLOAT|REGT_MULTIREG3));
((double *)Location)[0] = val[0]; ((double *)Location)[0] = val[0];
((double *)Location)[1] = val[1]; ((double *)Location)[1] = val[1];
((double *)Location)[2] = val[2]; ((double *)Location)[2] = val[2];
} }
void SetVector2(const double val[2]) void SetVector2(const double val[2])
{ {
//assert(RegType == REGT_FLOAT); assert(RegType == (REGT_FLOAT|REGT_MULTIREG2));
((double *)Location)[0] = val[0]; ((double *)Location)[0] = val[0];
((double *)Location)[1] = val[1]; ((double *)Location)[1] = val[1];
} }