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