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 23 /* si_int is defined in Linux sysroot's asm-generic/siginfo.h */ 24 #ifdef si_int 25 #undef si_int 26 #endif 27 typedef int si_int; 28 typedef unsigned su_int; 29 30 typedef long long di_int; 31 typedef unsigned long long du_int; 32 33 typedef union 34 { 35 di_int all; 36 struct 37 { 38 #if _YUGA_LITTLE_ENDIAN 39 su_int low; 40 si_int high; 41 #else 42 si_int high; 43 su_int low; 44 #endif /* _YUGA_LITTLE_ENDIAN */ 45 }s; 46 } dwords; 47 48 typedef union 49 { 50 du_int all; 51 struct 52 { 53 #if _YUGA_LITTLE_ENDIAN 54 su_int low; 55 su_int high; 56 #else 57 su_int high; 58 su_int low; 59 #endif /* _YUGA_LITTLE_ENDIAN */ 60 }s; 61 } udwords; 62 63 /* MIPS64 issue: PR 20098 */ 64 #if (defined(__LP64__) || defined(__wasm__)) && \ 65 !(defined(__mips__) && defined(__clang__)) 66 #define CRT_HAS_128BIT 67 #endif 68 69 #ifdef CRT_HAS_128BIT 70 typedef int ti_int __attribute__ ((mode (TI))); 71 typedef unsigned tu_int __attribute__ ((mode (TI))); 72 73 typedef union 74 { 75 ti_int all; 76 struct 77 { 78 #if _YUGA_LITTLE_ENDIAN 79 du_int low; 80 di_int high; 81 #else 82 di_int high; 83 du_int low; 84 #endif /* _YUGA_LITTLE_ENDIAN */ 85 }s; 86 } twords; 87 88 typedef union 89 { 90 tu_int all; 91 struct 92 { 93 #if _YUGA_LITTLE_ENDIAN 94 du_int low; 95 du_int high; 96 #else 97 du_int high; 98 du_int low; 99 #endif /* _YUGA_LITTLE_ENDIAN */ 100 }s; 101 } utwords; 102 make_ti(di_int h,di_int l)103static __inline ti_int make_ti(di_int h, di_int l) { 104 twords r; 105 r.s.high = h; 106 r.s.low = l; 107 return r.all; 108 } 109 make_tu(du_int h,du_int l)110static __inline tu_int make_tu(du_int h, du_int l) { 111 utwords r; 112 r.s.high = h; 113 r.s.low = l; 114 return r.all; 115 } 116 117 #endif /* CRT_HAS_128BIT */ 118 119 typedef union 120 { 121 su_int u; 122 float f; 123 } float_bits; 124 125 typedef union 126 { 127 udwords u; 128 double f; 129 } double_bits; 130 131 typedef struct 132 { 133 #if _YUGA_LITTLE_ENDIAN 134 udwords low; 135 udwords high; 136 #else 137 udwords high; 138 udwords low; 139 #endif /* _YUGA_LITTLE_ENDIAN */ 140 } uqwords; 141 142 typedef union 143 { 144 uqwords u; 145 long double f; 146 } long_double_bits; 147 148 #if __STDC_VERSION__ >= 199901L 149 typedef float _Complex Fcomplex; 150 typedef double _Complex Dcomplex; 151 typedef long double _Complex Lcomplex; 152 153 #define COMPLEX_REAL(x) __real__(x) 154 #define COMPLEX_IMAGINARY(x) __imag__(x) 155 #else 156 typedef struct { float real, imaginary; } Fcomplex; 157 158 typedef struct { double real, imaginary; } Dcomplex; 159 160 typedef struct { long double real, imaginary; } Lcomplex; 161 162 #define COMPLEX_REAL(x) (x).real 163 #define COMPLEX_IMAGINARY(x) (x).imaginary 164 #endif 165 #endif /* INT_TYPES_H */ 166 167