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));
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;