[compiler-rt] [builtins] Fix logb / logbl tests

Like was done before in D67999 for `logbf`, this patch fixes the tests for
the internal compiler-rt implementations of `logb` and `logbl` to consider
all NaNs equivalent. Not doing so was resulting in test failures for
riscv64, since the the NaNs had different signs, but the spec doesn't
specify the NaN signedness or payload.

Fixes bug 44244.

Reviewers: rupprecht, delcypher
Reviewed By: rupprecht, delcypher
Differential Revision: https://reviews.llvm.org/D74826
This commit is contained in:
Luís Marques 2020-02-20 10:12:31 +00:00
parent ddf60ba09f
commit 689f1e85ba
2 changed files with 11 additions and 7 deletions

View File

@ -20,8 +20,10 @@
int test__compiler_rt_logb(fp_t x) {
fp_t crt_value = __compiler_rt_logb(x);
fp_t libm_value = logb(x);
// Compare actual rep, e.g. to avoid NaN != the same NaN
if (toRep(crt_value) != toRep(libm_value)) {
// Compare the values, considering all NaNs equivalent, as the spec doesn't
// specify the NaN signedness/payload.
if (crt_value != libm_value &&
!(crt_isnan(crt_value) && crt_isnan(libm_value))) {
printf("error: in __compiler_rt_logb(%a [%lX]) = %a [%lX] != %a [%lX]\n",
x, toRep(x), crt_value, toRep(crt_value), libm_value,
toRep(libm_value));

View File

@ -27,18 +27,20 @@
int test__compiler_rt_logbl(fp_t x) {
fp_t crt_value = __compiler_rt_logbl(x);
fp_t libm_value = logbl(x);
// Compare actual rep, e.g. to avoid NaN != the same NaN
if (toRep(crt_value) != toRep(libm_value)) {
// Compare the values, considering all NaNs equivalent, as the spec doesn't
// specify the NaN signedness/payload.
if (crt_value != libm_value &&
!(crt_isnan(crt_value) && crt_isnan(libm_value))) {
// Split expected values into two for printf
twords x_t, crt_value_t, libm_value_t;
x_t.all = toRep(x);
crt_value_t.all = toRep(crt_value);
libm_value_t.all = toRep(libm_value);
printf(
"error: in __compiler_rt_logb(%a [%llX %llX]) = %a [%llX %llX] != %a "
"error: in __compiler_rt_logbl([%llX %llX]) = [%llX %llX] != "
"[%llX %llX]\n",
x, x_t.s.high, x_t.s.low, crt_value, crt_value_t.s.high,
crt_value_t.s.low, libm_value, libm_value_t.s.high, libm_value_t.s.low);
x_t.s.high, x_t.s.low, crt_value_t.s.high, crt_value_t.s.low,
libm_value_t.s.high, libm_value_t.s.low);
return 1;
}
return 0;