Skip to content

Commit

Permalink
Merge pull request #17801 from unknownbrackets/irjit-vminmax
Browse files Browse the repository at this point in the history
irjit: Fix vmin/vmax nan handling
  • Loading branch information
hrydgard committed Jul 30, 2023
2 parents 180bda6 + 6aa4b0c commit c8447ff
Showing 1 changed file with 20 additions and 4 deletions.
24 changes: 20 additions & 4 deletions Core/MIPS/IR/IRInterpreter.cpp
Expand Up @@ -783,12 +783,28 @@ u32 IRInterpret(MIPSState *mips, const IRInst *inst, int count) {
mips->f[inst->dest] = mips->f[inst->src1] / mips->f[inst->src2];
break;
case IROp::FMin:
// TODO: This doesn't handle VFPU ordering right.
mips->f[inst->dest] = std::min(mips->f[inst->src1], mips->f[inst->src2]);
if (my_isnan(mips->f[inst->src1]) || my_isnan(mips->f[inst->src2])) {
// See interpreter for this logic: this is for vmin, we're comparing mantissa+exp.
if (mips->fi[inst->src1] < 0 && mips->fi[inst->src2] < 0) {
mips->fi[inst->dest] = std::max(mips->fi[inst->src1], mips->fi[inst->src2]);
} else {
mips->fi[inst->dest] = std::min(mips->fi[inst->src1], mips->fi[inst->src2]);
}
} else {
mips->f[inst->dest] = std::min(mips->f[inst->src1], mips->f[inst->src2]);
}
break;
case IROp::FMax:
// TODO: This doesn't handle VFPU ordering right.
mips->f[inst->dest] = std::max(mips->f[inst->src1], mips->f[inst->src2]);
if (my_isnan(mips->f[inst->src1]) || my_isnan(mips->f[inst->src2])) {
// See interpreter for this logic: this is for vmax, we're comparing mantissa+exp.
if (mips->fi[inst->src1] < 0 && mips->fi[inst->src2] < 0) {
mips->fi[inst->dest] = std::min(mips->fi[inst->src1], mips->fi[inst->src2]);
} else {
mips->fi[inst->dest] = std::max(mips->fi[inst->src1], mips->fi[inst->src2]);
}
} else {
mips->f[inst->dest] = std::max(mips->f[inst->src1], mips->f[inst->src2]);
}
break;

case IROp::FMov:
Expand Down

0 comments on commit c8447ff

Please sign in to comment.