diff --git a/compiler-rt/test/builtins/Unit/compiler_rt_logb_test.c b/compiler-rt/test/builtins/Unit/compiler_rt_logb_test.c --- a/compiler-rt/test/builtins/Unit/compiler_rt_logb_test.c +++ b/compiler-rt/test/builtins/Unit/compiler_rt_logb_test.c @@ -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)); diff --git a/compiler-rt/test/builtins/Unit/compiler_rt_logbl_test.c b/compiler-rt/test/builtins/Unit/compiler_rt_logbl_test.c --- a/compiler-rt/test/builtins/Unit/compiler_rt_logbl_test.c +++ b/compiler-rt/test/builtins/Unit/compiler_rt_logbl_test.c @@ -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;