163212Sabial/* ===-- int_lib.h - configuration header for compiler-rt  -----------------===
263212Sabial *
363212Sabial *                     The LLVM Compiler Infrastructure
463212Sabial *
563212Sabial * This file is dual licensed under the MIT and the University of Illinois Open
663212Sabial * Source Licenses. See LICENSE.TXT for details.
763212Sabial *
863212Sabial * ===----------------------------------------------------------------------===
963212Sabial *
1063212Sabial * This file is not part of the interface of this library.
1163212Sabial *
1263212Sabial * This file defines various standard types, most importantly a number of unions
1363212Sabial * used to access parts of larger types.
1463212Sabial *
1563212Sabial * ===----------------------------------------------------------------------===
1663212Sabial */
1763212Sabial
1863212Sabial#ifndef INT_TYPES_H
1963212Sabial#define INT_TYPES_H
2063212Sabial
2163212Sabial#include "int_endianness.h"
2263212Sabial
2363212Sabial/* si_int is defined in Linux sysroot's asm-generic/siginfo.h */
2463212Sabial#ifdef si_int
2563212Sabial#undef si_int
2663212Sabial#endif
2763212Sabialtypedef      int si_int;
2863212Sabialtypedef unsigned su_int;
2963212Sabial
3063212Sabialtypedef          long long di_int;
3163212Sabialtypedef unsigned long long du_int;
3263212Sabial
3363212Sabialtypedef union
3463212Sabial{
3563212Sabial    di_int all;
3663212Sabial    struct
3763212Sabial    {
3863212Sabial#if _YUGA_LITTLE_ENDIAN
3963212Sabial        su_int low;
4063212Sabial        si_int high;
4163212Sabial#else
4263212Sabial        si_int high;
4363212Sabial        su_int low;
4463212Sabial#endif /* _YUGA_LITTLE_ENDIAN */
45193374Spjd    }s;
4663212Sabial} dwords;
4763212Sabial
4863212Sabialtypedef union
4963212Sabial{
5063212Sabial    du_int all;
5163212Sabial    struct
5263212Sabial    {
5363212Sabial#if _YUGA_LITTLE_ENDIAN
5463212Sabial        su_int low;
5563212Sabial        su_int high;
56193374Spjd#else
5763212Sabial        su_int high;
5863212Sabial        su_int low;
5963212Sabial#endif /* _YUGA_LITTLE_ENDIAN */
6063212Sabial    }s;
6163212Sabial} udwords;
62239130Semaste
6363212Sabial/* MIPS64 issue: PR 20098 */
6463212Sabial#if (defined(__LP64__) || defined(__wasm__)) && \
6563212Sabial    !(defined(__mips__) && defined(__clang__))
6663212Sabial#define CRT_HAS_128BIT
6763212Sabial#endif
6863212Sabial
6963212Sabial#ifdef CRT_HAS_128BIT
7063212Sabialtypedef int      ti_int __attribute__ ((mode (TI)));
7163212Sabialtypedef unsigned tu_int __attribute__ ((mode (TI)));
7263212Sabial
7363212Sabialtypedef union
7463212Sabial{
7572336Sabial    ti_int all;
7663212Sabial    struct
7763212Sabial    {
7863212Sabial#if _YUGA_LITTLE_ENDIAN
7972336Sabial        du_int low;
8063212Sabial        di_int high;
81193374Spjd#else
8263212Sabial        di_int high;
8363212Sabial        du_int low;
8463212Sabial#endif /* _YUGA_LITTLE_ENDIAN */
8563212Sabial    }s;
86193374Spjd} twords;
8763212Sabial
88193374Spjdtypedef union
89193374Spjd{
90193374Spjd    tu_int all;
9163212Sabial    struct
92193374Spjd    {
9363212Sabial#if _YUGA_LITTLE_ENDIAN
9463212Sabial        du_int low;
9563212Sabial        du_int high;
9663212Sabial#else
97193374Spjd        du_int high;
98193374Spjd        du_int low;
9963212Sabial#endif /* _YUGA_LITTLE_ENDIAN */
10063212Sabial    }s;
10163212Sabial} utwords;
10263212Sabial
103217566Smdfstatic __inline ti_int make_ti(di_int h, di_int l) {
104217566Smdf    twords r;
105217566Smdf    r.s.high = h;
10663212Sabial    r.s.low = l;
10763212Sabial    return r.all;
10863212Sabial}
10963212Sabial
110193374Spjdstatic __inline tu_int make_tu(du_int h, du_int l) {
11163212Sabial    utwords r;
112193374Spjd    r.s.high = h;
11363212Sabial    r.s.low = l;
11463212Sabial    return r.all;
11563212Sabial}
11663212Sabial
11763212Sabial#endif /* CRT_HAS_128BIT */
11863212Sabial
11963212Sabialtypedef union
12063212Sabial{
121193374Spjd    su_int u;
12263212Sabial    float f;
123193374Spjd} float_bits;
12463212Sabial
12563212Sabialtypedef union
126239130Semaste{
12763212Sabial    udwords u;
128193374Spjd    double  f;
12963212Sabial} double_bits;
13063212Sabial
13163212Sabialtypedef struct
13263212Sabial{
133193374Spjd#if _YUGA_LITTLE_ENDIAN
13463212Sabial    udwords low;
13563212Sabial    udwords high;
13663212Sabial#else
13763212Sabial    udwords high;
13863212Sabial    udwords low;
13963212Sabial#endif /* _YUGA_LITTLE_ENDIAN */
14063212Sabial} uqwords;
141193374Spjd
14263212Sabialtypedef union
14363212Sabial{
14463212Sabial    uqwords     u;
14563212Sabial    long double f;
14663212Sabial} long_double_bits;
14763212Sabial
14863212Sabial#if __STDC_VERSION__ >= 199901L
149193374Spjdtypedef float _Complex Fcomplex;
15063212Sabialtypedef double _Complex Dcomplex;
15163212Sabialtypedef long double _Complex Lcomplex;
15263212Sabial
15363212Sabial#define COMPLEX_REAL(x) __real__(x)
15463212Sabial#define COMPLEX_IMAGINARY(x) __imag__(x)
15563212Sabial#else
156239130Semastetypedef struct { float real, imaginary; } Fcomplex;
157134520Spjd
15863212Sabialtypedef struct { double real, imaginary; } Dcomplex;
15963212Sabial
160193374Spjdtypedef struct { long double real, imaginary; } Lcomplex;
16163212Sabial
16263212Sabial#define COMPLEX_REAL(x) (x).real
163193374Spjd#define COMPLEX_IMAGINARY(x) (x).imaginary
16463212Sabial#endif
16563212Sabial#endif /* INT_TYPES_H */
166241394Skevlo
16763212Sabial