brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.7 KiB · 0d9bbdf Raw
110 lines · c
1// RUN: %clang_builtins %s %librt -o %t && %run %t2 3#define QUAD_PRECISION4#include "fp_lib.h"5#include <fenv.h>6#include <float.h>7#include <limits.h>8#include <math.h>9#include <stdio.h>10 11#if defined(CRT_HAS_TF_MODE)12 13int test__compiler_rt_scalbnl(const char *mode, fp_t x, int y) {14#if defined(__ve__)15  if (fpclassify(x) == FP_SUBNORMAL)16    return 0;17#  endif18  fp_t crt_value = __compiler_rt_scalbnl(x, y);19  fp_t libm_value = scalbnl(x, y);20  // Consider +/-0 unequal, but disregard the sign/payload of NaN.21  if (toRep(crt_value) != toRep(libm_value) &&22      !(crt_isnan(crt_value) && crt_isnan(libm_value))) {23    // Split expected values into two for printf24    twords x_t, crt_value_t, libm_value_t;25    x_t.all = toRep(x);26    crt_value_t.all = toRep(crt_value);27    libm_value_t.all = toRep(libm_value);28    printf(29        "error: [%s] in __compiler_rt_scalbnl([%llX %llX], %d) = "30        "[%llX %llX] != [%llX %llX]\n",31        mode, (unsigned long long)x_t.s.high, (unsigned long long)x_t.s.low, y,32        (unsigned long long)crt_value_t.s.high,33        (unsigned long long)crt_value_t.s.low,34        (unsigned long long)libm_value_t.s.high,35        (unsigned long long)libm_value_t.s.low);36    return 1;37  }38  return 0;39}40 41fp_t cases[] = {42    -NAN,43    NAN,44    -INFINITY,45    INFINITY,46    -0.0,47    0.0,48    -1,49    1,50    -2,51    2,52// Since we are comparing the compiler-rt IEEE implementation against libc's53// long double implementation, this test can only succeed if long double54// is an IEEE 128-bit floating point number.55#  if defined(CRT_LDBL_IEEE_F128)56    LDBL_TRUE_MIN,57#  endif58    LDBL_MIN,59    LDBL_MAX,60    -1.001,61    1.001,62    -1.002,63    1.002,64    1.e-6,65    -1.e-6,66    TF_C(0x1.0p-16381),67    TF_C(0x1.0p-16382),68    TF_C(0x1.0p-16383), // subnormal69    TF_C(0x1.0p-16384), // subnormal70};71 72int iterate_cases(const char *mode) {73  const unsigned N = sizeof(cases) / sizeof(cases[0]);74  unsigned i;75  for (i = 0; i < N; ++i) {76    int j;77    for (j = -5; j <= 5; ++j) {78      printf("%d, %d\n", i, j);79      if (test__compiler_rt_scalbnl(mode, cases[i], j))80        return 1;81    }82    if (test__compiler_rt_scalbnl(mode, cases[i], -100000))83      return 1;84    if (test__compiler_rt_scalbnl(mode, cases[i], 100000))85      return 1;86    if (test__compiler_rt_scalbnl(mode, cases[i], INT_MIN))87      return 1;88    if (test__compiler_rt_scalbnl(mode, cases[i], INT_MAX))89      return 1;90  }91  return 0;92}93 94int main() {95  if (iterate_cases("default"))96    return 1;97 98  // Skip rounding mode tests (fesetround) because compiler-rt's quad-precision99  // multiply also ignores the current rounding mode.100 101  return 0;102}103 104#else105int main() {106  printf("skipped\n");107  return 0;108}109#endif110