aboutsummaryrefslogtreecommitdiff
path: root/compiler-rt/test/builtins/Unit/extendhfxf2_test.c
blob: d7227a9f1d156e38466f6682cf17bdafccfab398 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// RUN: %clang_builtins %s %librt -o %t && %run %t
// REQUIRES: librt_has_extendhfxf2

#include <limits.h>
#include <math.h> // for isnan, isinf
#include <stdio.h>

#include "fp_test.h"

#if HAS_80_BIT_LONG_DOUBLE

xf_float __extendhfxf2(TYPE_FP16 f);

int test_extendhfxf2(TYPE_FP16 a, uint16_t expectedHi, uint64_t expectedLo) {
  xf_float x = __extendhfxf2(a);
  int ret = compareResultF80(x, expectedHi, expectedLo);
  if (ret) {
    printf("error in test__extendhfxf2(%#.4x) = %.20Lf, "
           "expected %.20Lf\n",
           toRep16(a), x, F80FromRep80(expectedHi, expectedLo));
  }
  return ret;
}

int main() {
  // Small positive value
  if (test_extendhfxf2(fromRep16(0x2e66), UINT16_C(0x3ffb),
                       UINT64_C(0xccc0000000000000)))
    return 1;

  // Small negative value
  if (test_extendhfxf2(fromRep16(0xae66), UINT16_C(0xbffb),
                       UINT64_C(0xccc0000000000000)))
    return 1;

  // Zero
  if (test_extendhfxf2(fromRep16(0), UINT16_C(0x0), UINT64_C(0x0)))
    return 1;

  // Smallest positive non-zero value
  if (test_extendhfxf2(fromRep16(0x0100), UINT16_C(0x3fef),
                       UINT64_C(0x8000000000000000)))
    return 1;

  // Smallest negative non-zero value
  if (test_extendhfxf2(fromRep16(0x8100), UINT16_C(0xbfef),
                       UINT64_C(0x8000000000000000)))
    return 1;

  // Positive infinity
  if (test_extendhfxf2(makeInf16(), UINT16_C(0x7fff),
                       UINT64_C(0x8000000000000000)))
    return 1;

  // Negative infinity
  if (test_extendhfxf2(makeNegativeInf16(), UINT16_C(0xffff),
                       UINT64_C(0x8000000000000000)))
    return 1;

  // NaN
  if (test_extendhfxf2(makeQNaN16(), UINT16_C(0x7fff),
                       UINT64_C(0xc000000000000000)))
    return 1;

  return 0;
}

#else

int main() {
  printf("skipped\n");
  return 0;
}

#endif