blob: aedae14b2046cea9fa316ba95b2c7d9eae76f1b0 [file] [log] [blame]
Stephen Hines2d1fdb22014-05-28 23:58:16 -07001/* ===-- 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
Petar Jovanovic80610d62014-12-18 01:21:33 +000059/* MIPS64 issue: PR 20098 */
60#if defined(__LP64__) && !(defined(__mips__) && defined(__clang__))
Stephen Hines2d1fdb22014-05-28 23:58:16 -070061#define CRT_HAS_128BIT
62#endif
63
64#ifdef CRT_HAS_128BIT
65typedef int ti_int __attribute__ ((mode (TI)));
66typedef unsigned tu_int __attribute__ ((mode (TI)));
67
68typedef 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
83typedef 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
98static 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
105static 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
114typedef union
115{
116 su_int u;
117 float f;
118} float_bits;
119
120typedef union
121{
122 udwords u;
123 double f;
124} double_bits;
125
126typedef 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
137typedef union
138{
139 uqwords u;
140 long double f;
141} long_double_bits;
142
143#endif /* INT_TYPES_H */
144