brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · f49ce71 Raw
86 lines · c
1// RUN: %clang_builtins %s %librt -o %t && %run %t2 3#define QUAD_PRECISION4#include "fp_lib.h"5#include "int_lib.h"6#include <math.h>7#include <stdio.h>8 9#if defined(CRT_HAS_TF_MODE)10 11int test__compiler_rt_logbl(fp_t x) {12#  if defined(__ve__)13  if (fpclassify(x) == FP_SUBNORMAL)14    return 0;15#  endif16  fp_t crt_value = __compiler_rt_logbl(x);17  fp_t libm_value = logbl(x);18  // Compare the values, considering all NaNs equivalent, as the spec doesn't19  // specify the NaN signedness/payload.20  if (crt_value != libm_value &&21      !(crt_isnan(crt_value) && crt_isnan(libm_value))) {22    // Split expected values into two for printf23    twords x_t, crt_value_t, libm_value_t;24    x_t.all = toRep(x);25    crt_value_t.all = toRep(crt_value);26    libm_value_t.all = toRep(libm_value);27    printf("error: in __compiler_rt_logbl([%llX %llX]) = [%llX %llX] !=  "28           "[%llX %llX]\n",29           x_t.s.high, x_t.s.low, crt_value_t.s.high, crt_value_t.s.low,30           libm_value_t.s.high, libm_value_t.s.low);31    return 1;32  }33  return 0;34}35 36fp_t cases[] = {37    1.e-6, -1.e-6, NAN, -NAN, INFINITY, -INFINITY, -1,38    -0.0,  0.0,    1,   -2,   2,        -0.5,      0.5,39};40 41int main() {42  const unsigned N = sizeof(cases) / sizeof(cases[0]);43  for (unsigned i = 0; i < N; ++i) {44    if (test__compiler_rt_logbl(cases[i]))45      return 1;46  }47 48  // Test a moving 1 bit, especially to handle denormal values.49  // Test the negation as well.50  // Since we are comparing the compiler-rt IEEE implementation against libc's51  // long double implementation, this test can only succeed if long double52  // is an IEEE 128-bit floating point number (otherwise we will see mismatches53  // once we reach numbers that cannot be precisely represented in long double54  // format).55#  if defined(CRT_LDBL_IEEE_F128)56  rep_t x = signBit;57  int i = 0;58  while (x) {59    if (test__compiler_rt_logbl(fromRep(x)))60      return 1;61    if (test__compiler_rt_logbl(fromRep(signBit ^ x)))62      return 1;63    x >>= 1;64    printf("l1: %d\n", i++);65  }66  // Also try a couple moving ones67  x = signBit | (signBit >> 1) | (signBit >> 2);68  while (x) {69    if (test__compiler_rt_logbl(fromRep(x)))70      return 1;71    if (test__compiler_rt_logbl(fromRep(signBit ^ x)))72      return 1;73    x >>= 1;74    printf("l1: %d\n", i++);75  }76#endif77 78  return 0;79}80#else81int main() {82  printf("skipped\n");83  return 0;84}85#endif86