1/* ===-- int_lib.h - configuration header for compiler-rt  -----------------===
2 *
3 *                     The LLVM Compiler Infrastructure
4 *
5 * This file is distributed under the University of Illinois Open Source
6 * License. See LICENSE.TXT for details.
7 *
8 * ===----------------------------------------------------------------------===
9 *
10 * This file is a configuration header for compiler-rt.
11 * This file is not part of the interface of this library.
12 *
13 * ===----------------------------------------------------------------------===
14 */
15
16#ifndef INT_LIB_H
17#define INT_LIB_H
18
19/* Assumption:  signed integral is 2's complement */
20/* Assumption:  right shift of signed negative is arithmetic shift */
21
22#include <limits.h>
23#include "endianness.h"
24#include <math.h>
25
26#if !defined(INFINITY) && defined(HUGE_VAL)
27#define INFINITY HUGE_VAL
28#endif /* INFINITY */
29
30typedef      int si_int;
31typedef unsigned su_int;
32
33typedef          long long di_int;
34typedef unsigned long long du_int;
35
36typedef union
37{
38    di_int all;
39    struct
40    {
41#if _YUGA_LITTLE_ENDIAN
42        su_int low;
43        si_int high;
44#else
45        si_int high;
46        su_int low;
47#endif /* _YUGA_LITTLE_ENDIAN */
48    }s;
49} dwords;
50
51typedef union
52{
53    du_int all;
54    struct
55    {
56#if _YUGA_LITTLE_ENDIAN
57        su_int low;
58        su_int high;
59#else
60        su_int high;
61        su_int low;
62#endif /* _YUGA_LITTLE_ENDIAN */
63    }s;
64} udwords;
65
66#if __x86_64
67
68typedef int      ti_int __attribute__ ((mode (TI)));
69typedef unsigned tu_int __attribute__ ((mode (TI)));
70
71typedef union
72{
73    ti_int all;
74    struct
75    {
76#if _YUGA_LITTLE_ENDIAN
77        du_int low;
78        di_int high;
79#else
80        di_int high;
81        du_int low;
82#endif /* _YUGA_LITTLE_ENDIAN */
83    }s;
84} twords;
85
86typedef union
87{
88    tu_int all;
89    struct
90    {
91#if _YUGA_LITTLE_ENDIAN
92        du_int low;
93        du_int high;
94#else
95        du_int high;
96        du_int low;
97#endif /* _YUGA_LITTLE_ENDIAN */
98    }s;
99} utwords;
100
101static inline ti_int make_ti(di_int h, di_int l) {
102    twords r;
103    r.s.high = h;
104    r.s.low = l;
105    return r.all;
106}
107
108static inline tu_int make_tu(du_int h, du_int l) {
109    utwords r;
110    r.s.high = h;
111    r.s.low = l;
112    return r.all;
113}
114
115#endif /* __x86_64 */
116
117typedef union
118{
119    su_int u;
120    float f;
121} float_bits;
122
123typedef union
124{
125    udwords u;
126    double  f;
127} double_bits;
128
129typedef struct
130{
131#if _YUGA_LITTLE_ENDIAN
132    udwords low;
133    udwords high;
134#else
135    udwords high;
136    udwords low;
137#endif /* _YUGA_LITTLE_ENDIAN */
138} uqwords;
139
140typedef union
141{
142    uqwords     u;
143    long double f;
144} long_double_bits;
145
146#endif /* INT_LIB_H */
147