brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.9 KiB · 3c70e43 Raw
170 lines · c
1// RUN: %clang_builtins %s %librt -o %t && %run %t2// REQUIRES: librt_has_divtf33 4#include "int_lib.h"5#include <stdio.h>6 7// The testcase currently assumes IEEE TF format, once that has been8// fixed the defined(CRT_HAS_IEEE_TF) guard can be removed to enable it for9// IBM 128 floats as well.10#if defined(CRT_HAS_IEEE_TF)11 12#  include "fp_test.h"13 14// Returns: a / b15COMPILER_RT_ABI tf_float __divtf3(tf_float a, tf_float b);16 17int test__divtf3(tf_float a, tf_float b, uint64_t expectedHi,18                 uint64_t expectedLo) {19  tf_float x = __divtf3(a, b);20  int ret = compareResultF128(x, expectedHi, expectedLo);21 22  if (ret) {23    printf("error in test__divtf3(%.20Le, %.20Le) = %.20Le, "24           "expected %.20Le\n",25           a, b, x, fromRep128(expectedHi, expectedLo));26  }27  return ret;28}29 30char assumption_1[sizeof(tf_float) * CHAR_BIT == 128] = {0};31 32#endif33 34int main() {35#if defined(CRT_HAS_IEEE_TF)36  // Returned NaNs are assumed to be qNaN by default37 38  // qNaN / any = qNaN39  if (test__divtf3(makeQNaN128(), TF_C(0x1.23456789abcdefp+5),40                   UINT64_C(0x7fff800000000000), UINT64_C(0x0)))41    return 1;42  // NaN / any = NaN43  if (test__divtf3(makeNaN128(UINT64_C(0x30000000)),44                   TF_C(0x1.23456789abcdefp+5), UINT64_C(0x7fff800000000000),45                   UINT64_C(0x0)))46    return 1;47  // any / qNaN = qNaN48  if (test__divtf3(TF_C(0x1.23456789abcdefp+5), makeQNaN128(),49                   UINT64_C(0x7fff800000000000), UINT64_C(0x0)))50    return 1;51  // any / NaN = NaN52  if (test__divtf3(TF_C(0x1.23456789abcdefp+5),53                   makeNaN128(UINT64_C(0x30000000)),54                   UINT64_C(0x7fff800000000000), UINT64_C(0x0)))55    return 1;56 57  // +Inf / positive = +Inf58  if (test__divtf3(makeInf128(), TF_C(3.), UINT64_C(0x7fff000000000000),59                   UINT64_C(0x0)))60    return 1;61  // +Inf / negative = -Inf62  if (test__divtf3(makeInf128(), -TF_C(3.), UINT64_C(0xffff000000000000),63                   UINT64_C(0x0)))64    return 1;65  // -Inf / positive = -Inf66  if (test__divtf3(makeNegativeInf128(), TF_C(3.), UINT64_C(0xffff000000000000),67                   UINT64_C(0x0)))68    return 1;69  // -Inf / negative = +Inf70  if (test__divtf3(makeNegativeInf128(), -TF_C(3.),71                   UINT64_C(0x7fff000000000000), UINT64_C(0x0)))72    return 1;73 74  // Inf / Inf = NaN75  if (test__divtf3(makeInf128(), makeInf128(), UINT64_C(0x7fff800000000000),76                   UINT64_C(0x0)))77    return 1;78  // 0.0 / 0.0 = NaN79  if (test__divtf3(+TF_C(0x0.0p+0), +TF_C(0x0.0p+0),80                   UINT64_C(0x7fff800000000000), UINT64_C(0x0)))81    return 1;82  // +0.0 / +Inf = +0.083  if (test__divtf3(+TF_C(0x0.0p+0), makeInf128(), UINT64_C(0x0), UINT64_C(0x0)))84    return 1;85  // +Inf / +0.0 = +Inf86  if (test__divtf3(makeInf128(), +TF_C(0x0.0p+0), UINT64_C(0x7fff000000000000),87                   UINT64_C(0x0)))88    return 1;89 90  // positive / +0.0 = +Inf91  if (test__divtf3(+TF_C(1.0), +TF_C(0x0.0p+0), UINT64_C(0x7fff000000000000),92                   UINT64_C(0x0)))93    return 1;94  // positive / -0.0 = -Inf95  if (test__divtf3(+1.0L, -TF_C(0x0.0p+0), UINT64_C(0xffff000000000000),96                   UINT64_C(0x0)))97    return 1;98  // negative / +0.0 = -Inf99  if (test__divtf3(-1.0L, +TF_C(0x0.0p+0), UINT64_C(0xffff000000000000),100                   UINT64_C(0x0)))101    return 1;102  // negative / -0.0 = +Inf103  if (test__divtf3(TF_C(-1.0), -TF_C(0x0.0p+0), UINT64_C(0x7fff000000000000),104                   UINT64_C(0x0)))105    return 1;106 107  // 1/3108  if (test__divtf3(TF_C(1.), TF_C(3.), UINT64_C(0x3ffd555555555555),109                   UINT64_C(0x5555555555555555)))110    return 1;111  // smallest normal result112  if (test__divtf3(TF_C(0x1.0p-16381), TF_C(2.), UINT64_C(0x0001000000000000),113                   UINT64_C(0x0)))114    return 1;115 116  // divisor is exactly 1.0117  if (test__divtf3(TF_C(0x1.0p+0), TF_C(0x1.0p+0), UINT64_C(0x3fff000000000000),118                   UINT64_C(0x0)))119    return 1;120  // divisor is truncated to exactly 1.0 in UQ1.63121  if (test__divtf3(TF_C(0x1.0p+0), TF_C(0x1.0000000000000001p+0),122                   UINT64_C(0x3ffeffffffffffff), UINT64_C(0xfffe000000000000)))123    return 1;124 125  // smallest normal value divided by 2.0126  if (test__divtf3(TF_C(0x1.0p-16382), 2.L, UINT64_C(0x0000800000000000),127                   UINT64_C(0x0)))128    return 1;129  // smallest subnormal result130  if (test__divtf3(TF_C(0x1.0p-16382), TF_C(0x1p+112), UINT64_C(0x0),131                   UINT64_C(0x1)))132    return 1;133 134  // any / any135  if (test__divtf3(TF_C(0x1.a23b45362464523375893ab4cdefp+5),136                   TF_C(0x1.eedcbaba3a94546558237654321fp-1),137                   UINT64_C(0x4004b0b72924d407), UINT64_C(0x0717e84356c6eba2)))138    return 1;139  if (test__divtf3(TF_C(0x1.a2b34c56d745382f9abf2c3dfeffp-50),140                   TF_C(0x1.ed2c3ba15935332532287654321fp-9),141                   UINT64_C(0x3fd5b2af3f828c9b), UINT64_C(0x40e51f64cde8b1f2)))142    return 15;143  if (test__divtf3(TF_C(0x1.2345f6aaaa786555f42432abcdefp+456),144                   TF_C(0x1.edacbba9874f765463544dd3621fp+6400),145                   UINT64_C(0x28c62e15dc464466), UINT64_C(0xb5a07586348557ac)))146    return 1;147  if (test__divtf3(TF_C(0x1.2d3456f789ba6322bc665544edefp-234),148                   TF_C(0x1.eddcdba39f3c8b7a36564354321fp-4455),149                   UINT64_C(0x507b38442b539266), UINT64_C(0x22ce0f1d024e1252)))150    return 1;151  if (test__divtf3(TF_C(0x1.2345f6b77b7a8953365433abcdefp+234),152                   TF_C(0x1.edcba987d6bb3aa467754354321fp-4055),153                   UINT64_C(0x50bf2e02f0798d36), UINT64_C(0x5e6fcb6b60044078)))154    return 1;155  if (test__divtf3(TF_C(6.72420628622418701252535563464350521E-4932), TF_C(2.),156                   UINT64_C(0x0001000000000000), UINT64_C(0)))157    return 1;158 159  // test 1 / (1 - eps(0.5)) = 1 + eps(1).160  if (test__divtf3(1.0L, TF_C(0x1.ffffffffffffffffffffffffffffp-1),161                   UINT64_C(0x3FFF000000000000), UINT64_C(1)))162    return 1;163 164#else165  printf("skipped\n");166 167#endif168  return 0;169}170