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 typedef      int si_int;
24 typedef unsigned su_int;
25 
26 typedef          long long di_int;
27 typedef unsigned long long du_int;
28 
29 typedef union
30 {
31     di_int all;
32     struct
33     {
34 #if _YUGA_LITTLE_ENDIAN
35         su_int low;
36         si_int high;
37 #else
38         si_int high;
39         su_int low;
40 #endif /* _YUGA_LITTLE_ENDIAN */
41     }s;
42 } dwords;
43 
44 typedef union
45 {
46     du_int all;
47     struct
48     {
49 #if _YUGA_LITTLE_ENDIAN
50         su_int low;
51         su_int high;
52 #else
53         su_int high;
54         su_int low;
55 #endif /* _YUGA_LITTLE_ENDIAN */
56     }s;
57 } udwords;
58 
59 /* MIPS64 issue: PR 20098 */
60 #if defined(__LP64__) && !(defined(__mips__) && defined(__clang__))
61 #define CRT_HAS_128BIT
62 #endif
63 
64 #ifdef CRT_HAS_128BIT
65 typedef int      ti_int __attribute__ ((mode (TI)));
66 typedef unsigned tu_int __attribute__ ((mode (TI)));
67 
68 typedef union
69 {
70     ti_int all;
71     struct
72     {
73 #if _YUGA_LITTLE_ENDIAN
74         du_int low;
75         di_int high;
76 #else
77         di_int high;
78         du_int low;
79 #endif /* _YUGA_LITTLE_ENDIAN */
80     }s;
81 } twords;
82 
83 typedef union
84 {
85     tu_int all;
86     struct
87     {
88 #if _YUGA_LITTLE_ENDIAN
89         du_int low;
90         du_int high;
91 #else
92         du_int high;
93         du_int low;
94 #endif /* _YUGA_LITTLE_ENDIAN */
95     }s;
96 } utwords;
97 
make_ti(di_int h,di_int l)98 static inline ti_int make_ti(di_int h, di_int l) {
99     twords r;
100     r.s.high = h;
101     r.s.low = l;
102     return r.all;
103 }
104 
make_tu(du_int h,du_int l)105 static inline tu_int make_tu(du_int h, du_int l) {
106     utwords r;
107     r.s.high = h;
108     r.s.low = l;
109     return r.all;
110 }
111 
112 #endif /* CRT_HAS_128BIT */
113 
114 typedef union
115 {
116     su_int u;
117     float f;
118 } float_bits;
119 
120 typedef union
121 {
122     udwords u;
123     double  f;
124 } double_bits;
125 
126 typedef struct
127 {
128 #if _YUGA_LITTLE_ENDIAN
129     udwords low;
130     udwords high;
131 #else
132     udwords high;
133     udwords low;
134 #endif /* _YUGA_LITTLE_ENDIAN */
135 } uqwords;
136 
137 typedef union
138 {
139     uqwords     u;
140     long double f;
141 } long_double_bits;
142 
143 #endif /* INT_TYPES_H */
144 
145