mirror of
https://github.com/ZDoom/gzdoom-gles.git
synced 2024-12-01 00:21:35 +00:00
Fix FxRandomPick code generation for floats
This commit is contained in:
parent
48dcbabd60
commit
c978aa32b1
1 changed files with 10 additions and 11 deletions
|
@ -2145,7 +2145,6 @@ FxExpression *FxRandomPick::Resolve(FCompileContext &ctx)
|
||||||
|
|
||||||
ExpEmit FxRandomPick::Emit(VMFunctionBuilder *build)
|
ExpEmit FxRandomPick::Emit(VMFunctionBuilder *build)
|
||||||
{
|
{
|
||||||
#pragma message("FxRandomPick::Emit: Floating point part needs reviewing!")
|
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
assert(choices.Size() > 0);
|
assert(choices.Size() > 0);
|
||||||
|
@ -2171,6 +2170,14 @@ ExpEmit FxRandomPick::Emit(VMFunctionBuilder *build)
|
||||||
// automatically pick it as the destination register for each case.
|
// automatically pick it as the destination register for each case.
|
||||||
resultreg.Free(build);
|
resultreg.Free(build);
|
||||||
|
|
||||||
|
// For floating point results, we need to get a new register, since we can't
|
||||||
|
// reuse the integer one used to store the random result.
|
||||||
|
if (ValueType == VAL_Float)
|
||||||
|
{
|
||||||
|
resultreg = ExpEmit(build, REGT_FLOAT);
|
||||||
|
resultreg.Free(build);
|
||||||
|
}
|
||||||
|
|
||||||
// Allocate space for the jump table.
|
// Allocate space for the jump table.
|
||||||
size_t jumptable = build->Emit(OP_JMP, 0);
|
size_t jumptable = build->Emit(OP_JMP, 0);
|
||||||
for (i = 1; i < choices.Size(); ++i)
|
for (i = 1; i < choices.Size(); ++i)
|
||||||
|
@ -2193,8 +2200,7 @@ ExpEmit FxRandomPick::Emit(VMFunctionBuilder *build)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
double val = static_cast<FxConstant *>(choices[i])->GetValue().GetFloat();
|
double val = static_cast<FxConstant *>(choices[i])->GetValue().GetFloat();
|
||||||
build->Emit(OP_PARAM, 0, REGT_FLOAT | REGT_KONST, build->GetConstantFloat(val));
|
build->Emit(OP_LKF, resultreg.RegNum, build->GetConstantFloat(val));
|
||||||
build->ParamChange(-1); // all params should use the same register here.
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -2205,14 +2211,7 @@ ExpEmit FxRandomPick::Emit(VMFunctionBuilder *build)
|
||||||
// was expected. Copy it to the one we wanted.
|
// was expected. Copy it to the one we wanted.
|
||||||
|
|
||||||
resultreg.Reuse(build); // This is really just for the assert in Reuse()
|
resultreg.Reuse(build); // This is really just for the assert in Reuse()
|
||||||
if (ValueType == VAL_Int)
|
build->Emit(ValueType == VAL_Int ? OP_MOVE : OP_MOVEF, resultreg.RegNum, casereg.RegNum, 0);
|
||||||
{
|
|
||||||
build->Emit(OP_MOVE, resultreg.RegNum, casereg.RegNum, 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
build->Emit(OP_MOVEF, resultreg.RegNum, casereg.RegNum, 0);
|
|
||||||
}
|
|
||||||
resultreg.Free(build);
|
resultreg.Free(build);
|
||||||
}
|
}
|
||||||
// Free this register so the remaining cases can use it.
|
// Free this register so the remaining cases can use it.
|
||||||
|
|
Loading…
Reference in a new issue