1 /* ===-- int_lib.h - configuration header for compiler-rt  -----------------===
2  *
3  *                     The LLVM Compiler Infrastructure
4  *
5  * This file is dual licensed under the MIT and the University of Illinois Open
6  * Source Licenses. See LICENSE.TXT for details.
7  *
8  * ===----------------------------------------------------------------------===
9  *
10  * This file is not part of the interface of this library.
11  *
12  * This file defines various standard types, most importantly a number of unions
13  * used to access parts of larger types.
14  *
15  * ===----------------------------------------------------------------------===
16  */
17 
18 #ifndef INT_TYPES_H
19 #define INT_TYPES_H
20 
21 #include "int_endianness.h"
22 
23 /* si_int is defined in Linux sysroot's asm-generic/siginfo.h */
24 #ifdef si_int
25 #undef si_int
26 #endif
27 typedef      int si_int;
28 typedef unsigned su_int;
29 
30 typedef          long long di_int;
31 typedef unsigned long long du_int;
32 
33 typedef union
34 {
35     di_int all;
36     struct
37     {
38 #if _YUGA_LITTLE_ENDIAN
39         su_int low;
40         si_int high;
41 #else
42         si_int high;
43         su_int low;
44 #endif /* _YUGA_LITTLE_ENDIAN */
45     }s;
46 } dwords;
47 
48 typedef union
49 {
50     du_int all;
51     struct
52     {
53 #if _YUGA_LITTLE_ENDIAN
54         su_int low;
55         su_int high;
56 #else
57         su_int high;
58         su_int low;
59 #endif /* _YUGA_LITTLE_ENDIAN */
60     }s;
61 } udwords;
62 
63 /* MIPS64 issue: PR 20098 */
64 #if (defined(__LP64__) || defined(__wasm__)) && \
65     !(defined(__mips__) && defined(__clang__))
66 #define CRT_HAS_128BIT
67 #endif
68 
69 #ifdef CRT_HAS_128BIT
70 typedef int      ti_int __attribute__ ((mode (TI)));
71 typedef unsigned tu_int __attribute__ ((mode (TI)));
72 
73 typedef union
74 {
75     ti_int all;
76     struct
77     {
78 #if _YUGA_LITTLE_ENDIAN
79         du_int low;
80         di_int high;
81 #else
82         di_int high;
83         du_int low;
84 #endif /* _YUGA_LITTLE_ENDIAN */
85     }s;
86 } twords;
87 
88 typedef union
89 {
90     tu_int all;
91     struct
92     {
93 #if _YUGA_LITTLE_ENDIAN
94         du_int low;
95         du_int high;
96 #else
97         du_int high;
98         du_int low;
99 #endif /* _YUGA_LITTLE_ENDIAN */
100     }s;
101 } utwords;
102 
make_ti(di_int h,di_int l)103 static __inline ti_int make_ti(di_int h, di_int l) {
104     twords r;
105     r.s.high = h;
106     r.s.low = l;
107     return r.all;
108 }
109 
make_tu(du_int h,du_int l)110 static __inline tu_int make_tu(du_int h, du_int l) {
111     utwords r;
112     r.s.high = h;
113     r.s.low = l;
114     return r.all;
115 }
116 
117 #endif /* CRT_HAS_128BIT */
118 
119 typedef union
120 {
121     su_int u;
122     float f;
123 } float_bits;
124 
125 typedef union
126 {
127     udwords u;
128     double  f;
129 } double_bits;
130 
131 typedef struct
132 {
133 #if _YUGA_LITTLE_ENDIAN
134     udwords low;
135     udwords high;
136 #else
137     udwords high;
138     udwords low;
139 #endif /* _YUGA_LITTLE_ENDIAN */
140 } uqwords;
141 
142 typedef union
143 {
144     uqwords     u;
145     long double f;
146 } long_double_bits;
147 
148 #if __STDC_VERSION__ >= 199901L
149 typedef float _Complex Fcomplex;
150 typedef double _Complex Dcomplex;
151 typedef long double _Complex Lcomplex;
152 
153 #define COMPLEX_REAL(x) __real__(x)
154 #define COMPLEX_IMAGINARY(x) __imag__(x)
155 #else
156 typedef struct { float real, imaginary; } Fcomplex;
157 
158 typedef struct { double real, imaginary; } Dcomplex;
159 
160 typedef struct { long double real, imaginary; } Lcomplex;
161 
162 #define COMPLEX_REAL(x) (x).real
163 #define COMPLEX_IMAGINARY(x) (x).imaginary
164 #endif
165 #endif /* INT_TYPES_H */
166 
167