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
23typedef      int si_int;
24typedef unsigned su_int;
25
26typedef          long long di_int;
27typedef unsigned long long du_int;
28
29typedef 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
44typedef 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#if __x86_64
60
61typedef int      ti_int __attribute__ ((mode (TI)));
62typedef unsigned tu_int __attribute__ ((mode (TI)));
63
64typedef union
65{
66    ti_int all;
67    struct
68    {
69#if _YUGA_LITTLE_ENDIAN
70        du_int low;
71        di_int high;
72#else
73        di_int high;
74        du_int low;
75#endif /* _YUGA_LITTLE_ENDIAN */
76    }s;
77} twords;
78
79typedef union
80{
81    tu_int all;
82    struct
83    {
84#if _YUGA_LITTLE_ENDIAN
85        du_int low;
86        du_int high;
87#else
88        du_int high;
89        du_int low;
90#endif /* _YUGA_LITTLE_ENDIAN */
91    }s;
92} utwords;
93
94static inline ti_int make_ti(di_int h, di_int l) {
95    twords r;
96    r.s.high = h;
97    r.s.low = l;
98    return r.all;
99}
100
101static inline tu_int make_tu(du_int h, du_int l) {
102    utwords r;
103    r.s.high = h;
104    r.s.low = l;
105    return r.all;
106}
107
108#endif /* __x86_64 */
109
110typedef union
111{
112    su_int u;
113    float f;
114} float_bits;
115
116typedef union
117{
118    udwords u;
119    double  f;
120} double_bits;
121
122typedef struct
123{
124#if _YUGA_LITTLE_ENDIAN
125    udwords low;
126    udwords high;
127#else
128    udwords high;
129    udwords low;
130#endif /* _YUGA_LITTLE_ENDIAN */
131} uqwords;
132
133typedef union
134{
135    uqwords     u;
136    long double f;
137} long_double_bits;
138
139#endif /* INT_TYPES_H */
140
141