xref: /llvm-project/compiler-rt/test/builtins/Unit/extendhfxf2_test.c (revision d33dc14833b581d276a712a8425ab8f62a59c589)
1 // RUN: %clang_builtins %s %librt -o %t && %run %t
2 // REQUIRES: librt_has_extendhfxf2
3 
4 #include <limits.h>
5 #include <math.h> // for isnan, isinf
6 #include <stdio.h>
7 
8 #include "fp_test.h"
9 
10 #if HAS_80_BIT_LONG_DOUBLE
11 
12 xf_float __extendhfxf2(TYPE_FP16 f);
13 
14 int test_extendhfxf2(TYPE_FP16 a, uint16_t expectedHi, uint64_t expectedLo) {
15   xf_float x = __extendhfxf2(a);
16   int ret = compareResultF80(x, expectedHi, expectedLo);
17   if (ret) {
18     printf("error in test__extendhfxf2(%#.4x) = %.20Lf, "
19            "expected %.20Lf\n",
20            toRep16(a), x, F80FromRep80(expectedHi, expectedLo));
21   }
22   return ret;
23 }
24 
25 int main() {
26   // Small positive value
27   if (test_extendhfxf2(fromRep16(0x2e66), UINT16_C(0x3ffb),
28                        UINT64_C(0xccc0000000000000)))
29     return 1;
30 
31   // Small negative value
32   if (test_extendhfxf2(fromRep16(0xae66), UINT16_C(0xbffb),
33                        UINT64_C(0xccc0000000000000)))
34     return 1;
35 
36   // Zero
37   if (test_extendhfxf2(fromRep16(0), UINT16_C(0x0), UINT64_C(0x0)))
38     return 1;
39 
40   // Smallest positive non-zero value
41   if (test_extendhfxf2(fromRep16(0x0100), UINT16_C(0x3fef),
42                        UINT64_C(0x8000000000000000)))
43     return 1;
44 
45   // Smallest negative non-zero value
46   if (test_extendhfxf2(fromRep16(0x8100), UINT16_C(0xbfef),
47                        UINT64_C(0x8000000000000000)))
48     return 1;
49 
50   // Positive infinity
51   if (test_extendhfxf2(makeInf16(), UINT16_C(0x7fff),
52                        UINT64_C(0x8000000000000000)))
53     return 1;
54 
55   // Negative infinity
56   if (test_extendhfxf2(makeNegativeInf16(), UINT16_C(0xffff),
57                        UINT64_C(0x8000000000000000)))
58     return 1;
59 
60   // NaN
61   if (test_extendhfxf2(makeQNaN16(), UINT16_C(0x7fff),
62                        UINT64_C(0xc000000000000000)))
63     return 1;
64 
65   return 0;
66 }
67 
68 #else
69 
70 int main() {
71   printf("skipped\n");
72   return 0;
73 }
74 
75 #endif
76