]> git.proxmox.com Git - rustc.git/blob - src/libcompiler_builtins/compiler-rt/test/builtins/Unit/fixsfti_test.c
New upstream version 1.25.0+dfsg1
[rustc.git] / src / libcompiler_builtins / compiler-rt / test / builtins / Unit / fixsfti_test.c
1 // RUN: %clang_builtins %s %librt -o %t && %run %t
2 //===-- fixsfti_test.c - Test __fixsfti -----------------------------------===//
3 //
4 // The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10 //
11 // This file tests __fixsfti for the compiler_rt library.
12 //
13 //===----------------------------------------------------------------------===//
14
15 #include "int_lib.h"
16 #include <stdio.h>
17
18 #ifdef CRT_HAS_128BIT
19
20 // Returns: convert a to a signed long long, rounding toward zero.
21
22 // Assumption: float is a IEEE 32 bit floating point type
23 // su_int is a 32 bit integral type
24 // value in float is representable in ti_int (no range checking performed)
25
26 // seee eeee emmm mmmm mmmm mmmm mmmm mmmm
27
28 COMPILER_RT_ABI ti_int __fixsfti(float a);
29
30 int test__fixsfti(float a, ti_int expected)
31 {
32 ti_int x = __fixsfti(a);
33 if (x != expected)
34 {
35 twords xt;
36 xt.all = x;
37 twords expectedt;
38 expectedt.all = expected;
39 printf("error in __fixsfti(%A) = 0x%.16llX%.16llX, expected 0x%.16llX%.16llX\n",
40 a, xt.s.high, xt.s.low, expectedt.s.high, expectedt.s.low);
41 }
42 return x != expected;
43 }
44
45 char assumption_1[sizeof(ti_int) == 2*sizeof(di_int)] = {0};
46 char assumption_2[sizeof(su_int)*CHAR_BIT == 32] = {0};
47 char assumption_3[sizeof(float)*CHAR_BIT == 32] = {0};
48
49 #endif
50
51 int main()
52 {
53 #ifdef CRT_HAS_128BIT
54 if (test__fixsfti(0.0F, 0))
55 return 1;
56
57 if (test__fixsfti(0.5F, 0))
58 return 1;
59 if (test__fixsfti(0.99F, 0))
60 return 1;
61 if (test__fixsfti(1.0F, 1))
62 return 1;
63 if (test__fixsfti(1.5F, 1))
64 return 1;
65 if (test__fixsfti(1.99F, 1))
66 return 1;
67 if (test__fixsfti(2.0F, 2))
68 return 1;
69 if (test__fixsfti(2.01F, 2))
70 return 1;
71 if (test__fixsfti(-0.5F, 0))
72 return 1;
73 if (test__fixsfti(-0.99F, 0))
74 return 1;
75 if (test__fixsfti(-1.0F, -1))
76 return 1;
77 if (test__fixsfti(-1.5F, -1))
78 return 1;
79 if (test__fixsfti(-1.99F, -1))
80 return 1;
81 if (test__fixsfti(-2.0F, -2))
82 return 1;
83 if (test__fixsfti(-2.01F, -2))
84 return 1;
85
86 if (test__fixsfti(0x1.FFFFFEp+62F, 0x7FFFFF8000000000LL))
87 return 1;
88 if (test__fixsfti(0x1.FFFFFCp+62F, 0x7FFFFF0000000000LL))
89 return 1;
90
91 if (test__fixsfti(-0x1.FFFFFEp+62F, make_ti(0xFFFFFFFFFFFFFFFFLL,
92 0x8000008000000000LL)))
93 return 1;
94 if (test__fixsfti(-0x1.FFFFFCp+62F, make_ti(0xFFFFFFFFFFFFFFFFLL,
95 0x8000010000000000LL)))
96 return 1;
97
98 if (test__fixsfti(0x1.FFFFFEp+126F, make_ti(0x7FFFFF8000000000LL, 0)))
99 return 1;
100 if (test__fixsfti(0x1.FFFFFCp+126F, make_ti(0x7FFFFF0000000000LL, 0)))
101 return 1;
102
103 if (test__fixsfti(-0x1.FFFFFEp+126F, make_ti(0x8000008000000000LL, 0)))
104 return 1;
105 if (test__fixsfti(-0x1.FFFFFCp+126F, make_ti(0x8000010000000000LL, 0)))
106 return 1;
107
108 #else
109 printf("skipped\n");
110 #endif
111 return 0;
112 }