xref: /aosp_15_r20/external/compiler-rt/test/builtins/Unit/multf3_test.c (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
1*7c3d14c8STreehugger Robot //===--------------- multf3_test.c - Test __multf3 ------------------------===//
2*7c3d14c8STreehugger Robot //
3*7c3d14c8STreehugger Robot //                     The LLVM Compiler Infrastructure
4*7c3d14c8STreehugger Robot //
5*7c3d14c8STreehugger Robot // This file is dual licensed under the MIT and the University of Illinois Open
6*7c3d14c8STreehugger Robot // Source Licenses. See LICENSE.TXT for details.
7*7c3d14c8STreehugger Robot //
8*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===//
9*7c3d14c8STreehugger Robot //
10*7c3d14c8STreehugger Robot // This file tests __multf3 for the compiler_rt library.
11*7c3d14c8STreehugger Robot //
12*7c3d14c8STreehugger Robot //===----------------------------------------------------------------------===//
13*7c3d14c8STreehugger Robot 
14*7c3d14c8STreehugger Robot #include <stdio.h>
15*7c3d14c8STreehugger Robot 
16*7c3d14c8STreehugger Robot #if __LDBL_MANT_DIG__ == 113
17*7c3d14c8STreehugger Robot 
18*7c3d14c8STreehugger Robot #include "fp_test.h"
19*7c3d14c8STreehugger Robot 
20*7c3d14c8STreehugger Robot // Returns: a * b
21*7c3d14c8STreehugger Robot COMPILER_RT_ABI long double __multf3(long double a, long double b);
22*7c3d14c8STreehugger Robot 
test__multf3(long double a,long double b,uint64_t expectedHi,uint64_t expectedLo)23*7c3d14c8STreehugger Robot int test__multf3(long double a, long double b,
24*7c3d14c8STreehugger Robot                  uint64_t expectedHi, uint64_t expectedLo)
25*7c3d14c8STreehugger Robot {
26*7c3d14c8STreehugger Robot     long double x = __multf3(a, b);
27*7c3d14c8STreehugger Robot     int ret = compareResultLD(x, expectedHi, expectedLo);
28*7c3d14c8STreehugger Robot 
29*7c3d14c8STreehugger Robot     if (ret){
30*7c3d14c8STreehugger Robot         printf("error in test__multf3(%.20Lf, %.20Lf) = %.20Lf, "
31*7c3d14c8STreehugger Robot                "expected %.20Lf\n", a, b, x,
32*7c3d14c8STreehugger Robot                fromRep128(expectedHi, expectedLo));
33*7c3d14c8STreehugger Robot     }
34*7c3d14c8STreehugger Robot     return ret;
35*7c3d14c8STreehugger Robot }
36*7c3d14c8STreehugger Robot 
37*7c3d14c8STreehugger Robot char assumption_1[sizeof(long double) * CHAR_BIT == 128] = {0};
38*7c3d14c8STreehugger Robot 
39*7c3d14c8STreehugger Robot #endif
40*7c3d14c8STreehugger Robot 
main()41*7c3d14c8STreehugger Robot int main()
42*7c3d14c8STreehugger Robot {
43*7c3d14c8STreehugger Robot #if __LDBL_MANT_DIG__ == 113
44*7c3d14c8STreehugger Robot     // qNaN * any = qNaN
45*7c3d14c8STreehugger Robot     if (test__multf3(makeQNaN128(),
46*7c3d14c8STreehugger Robot                      0x1.23456789abcdefp+5L,
47*7c3d14c8STreehugger Robot                      UINT64_C(0x7fff800000000000),
48*7c3d14c8STreehugger Robot                      UINT64_C(0x0)))
49*7c3d14c8STreehugger Robot         return 1;
50*7c3d14c8STreehugger Robot     // NaN * any = NaN
51*7c3d14c8STreehugger Robot     if (test__multf3(makeNaN128(UINT64_C(0x800030000000)),
52*7c3d14c8STreehugger Robot                      0x1.23456789abcdefp+5L,
53*7c3d14c8STreehugger Robot                      UINT64_C(0x7fff800000000000),
54*7c3d14c8STreehugger Robot                      UINT64_C(0x0)))
55*7c3d14c8STreehugger Robot         return 1;
56*7c3d14c8STreehugger Robot     // inf * any = inf
57*7c3d14c8STreehugger Robot     if (test__multf3(makeInf128(),
58*7c3d14c8STreehugger Robot                      0x1.23456789abcdefp+5L,
59*7c3d14c8STreehugger Robot                      UINT64_C(0x7fff000000000000),
60*7c3d14c8STreehugger Robot                      UINT64_C(0x0)))
61*7c3d14c8STreehugger Robot         return 1;
62*7c3d14c8STreehugger Robot     // any * any
63*7c3d14c8STreehugger Robot     if (test__multf3(0x1.2eab345678439abcdefea56782346p+5L,
64*7c3d14c8STreehugger Robot                      0x1.edcb34a235253948765432134674fp-1L,
65*7c3d14c8STreehugger Robot                      UINT64_C(0x400423e7f9e3c9fc),
66*7c3d14c8STreehugger Robot                      UINT64_C(0xd906c2c2a85777c4)))
67*7c3d14c8STreehugger Robot         return 1;
68*7c3d14c8STreehugger Robot     if (test__multf3(0x1.353e45674d89abacc3a2ebf3ff4ffp-50L,
69*7c3d14c8STreehugger Robot                      0x1.ed8764648369535adf4be3214567fp-9L,
70*7c3d14c8STreehugger Robot                      UINT64_C(0x3fc52a163c6223fc),
71*7c3d14c8STreehugger Robot                      UINT64_C(0xc94c4bf0430768b4)))
72*7c3d14c8STreehugger Robot         return 1;
73*7c3d14c8STreehugger Robot     if (test__multf3(0x1.234425696abcad34a35eeffefdcbap+456L,
74*7c3d14c8STreehugger Robot                      0x451.ed98d76e5d46e5f24323dff21ffp+600L,
75*7c3d14c8STreehugger Robot                      UINT64_C(0x44293a91de5e0e94),
76*7c3d14c8STreehugger Robot                      UINT64_C(0xe8ed17cc2cdf64ac)))
77*7c3d14c8STreehugger Robot         return 1;
78*7c3d14c8STreehugger Robot     if (test__multf3(0x1.4356473c82a9fabf2d22ace345defp-234L,
79*7c3d14c8STreehugger Robot                      0x1.eda98765476743ab21da23d45678fp-455L,
80*7c3d14c8STreehugger Robot                      UINT64_C(0x3d4f37c1a3137cae),
81*7c3d14c8STreehugger Robot                      UINT64_C(0xfc6807048bc2836a)))
82*7c3d14c8STreehugger Robot         return 1;
83*7c3d14c8STreehugger Robot     // underflow
84*7c3d14c8STreehugger Robot     if (test__multf3(0x1.23456734245345p-10000L,
85*7c3d14c8STreehugger Robot                      0x1.edcba524498724p-6497L,
86*7c3d14c8STreehugger Robot                      UINT64_C(0x0),
87*7c3d14c8STreehugger Robot                      UINT64_C(0x0)))
88*7c3d14c8STreehugger Robot         return 1;
89*7c3d14c8STreehugger Robot 
90*7c3d14c8STreehugger Robot #else
91*7c3d14c8STreehugger Robot     printf("skipped\n");
92*7c3d14c8STreehugger Robot 
93*7c3d14c8STreehugger Robot #endif
94*7c3d14c8STreehugger Robot     return 0;
95*7c3d14c8STreehugger Robot }
96