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