softfloat: Handle snan_bit_is_one == 0 in MIPS pickNaNMulAdd()

Only for Mips platform, and only for cases when snan_bit_is_one is 0,
correct the order of argument comparisons in pickNaNMulAdd().

For more info, see [1], page 53, section "3.5.3 NaN Propagation".

[1] "MIPS Architecture for Programmers Volume IV-j:
    The MIPS32 SIMD Architecture Module",
    Imagination Technologies LTD, Revision 1.12, February 3, 2016

Signed-off-by: Aleksandar Markovic <aleksandar.markovic@imgtec.com>
Reviewed-by: Leon Alrae <leon.alrae@imgtec.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
[leon.alrae@imgtec.com:
 * reworded the subject of the patch
 * swapped if/else code blocks to match the commit description]
Signed-off-by: Leon Alrae <leon.alrae@imgtec.com>
master
Aleksandar Markovic 2016-06-10 11:57:31 +02:00 committed by Leon Alrae
parent a7c04d545a
commit c27644f0e9
1 changed files with 29 additions and 12 deletions

View File

@ -571,19 +571,36 @@ static int pickNaNMulAdd(flag aIsQNaN, flag aIsSNaN, flag bIsQNaN, flag bIsSNaN,
return 3; return 3;
} }
/* Prefer sNaN over qNaN, in the a, b, c order. */ if (status->snan_bit_is_one) {
if (aIsSNaN) { /* Prefer sNaN over qNaN, in the a, b, c order. */
return 0; if (aIsSNaN) {
} else if (bIsSNaN) { return 0;
return 1; } else if (bIsSNaN) {
} else if (cIsSNaN) { return 1;
return 2; } else if (cIsSNaN) {
} else if (aIsQNaN) { return 2;
return 0; } else if (aIsQNaN) {
} else if (bIsQNaN) { return 0;
return 1; } else if (bIsQNaN) {
return 1;
} else {
return 2;
}
} else { } else {
return 2; /* Prefer sNaN over qNaN, in the c, a, b order. */
if (cIsSNaN) {
return 2;
} else if (aIsSNaN) {
return 0;
} else if (bIsSNaN) {
return 1;
} else if (cIsQNaN) {
return 2;
} else if (aIsQNaN) {
return 0;
} else {
return 1;
}
} }
} }
#elif defined(TARGET_PPC) #elif defined(TARGET_PPC)