Merge pull request #17801 from unknownbrackets/irjit-vminmax

irjit: Fix vmin/vmax nan handling
This commit is contained in:
Henrik Rydgård 2023-07-30 09:18:25 +02:00 committed by GitHub
commit c8447ff4b7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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: