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