Home | History | Annotate | Line # | Download | only in builtins
      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     !defined(__PCC__)
     67 #define CRT_HAS_128BIT
     68 #endif
     69 
     70 #ifdef CRT_HAS_128BIT
     71 typedef int      ti_int __attribute__ ((mode (TI)));
     72 typedef unsigned tu_int __attribute__ ((mode (TI)));
     73 
     74 typedef union
     75 {
     76     ti_int all;
     77     struct
     78     {
     79 #if _YUGA_LITTLE_ENDIAN
     80         du_int low;
     81         di_int high;
     82 #else
     83         di_int high;
     84         du_int low;
     85 #endif /* _YUGA_LITTLE_ENDIAN */
     86     }s;
     87 } twords;
     88 
     89 typedef union
     90 {
     91     tu_int all;
     92     struct
     93     {
     94 #if _YUGA_LITTLE_ENDIAN
     95         du_int low;
     96         du_int high;
     97 #else
     98         du_int high;
     99         du_int low;
    100 #endif /* _YUGA_LITTLE_ENDIAN */
    101     }s;
    102 } utwords;
    103 
    104 static __inline ti_int make_ti(di_int h, di_int l) {
    105     twords r;
    106     r.s.high = h;
    107     r.s.low = l;
    108     return r.all;
    109 }
    110 
    111 static __inline tu_int make_tu(du_int h, du_int l) {
    112     utwords r;
    113     r.s.high = h;
    114     r.s.low = l;
    115     return r.all;
    116 }
    117 
    118 #endif /* CRT_HAS_128BIT */
    119 
    120 typedef union
    121 {
    122     su_int u;
    123     float f;
    124 } float_bits;
    125 
    126 typedef union
    127 {
    128     udwords u;
    129     double  f;
    130 } double_bits;
    131 
    132 typedef struct
    133 {
    134 #if _YUGA_LITTLE_ENDIAN
    135     udwords low;
    136     udwords high;
    137 #else
    138     udwords high;
    139     udwords low;
    140 #endif /* _YUGA_LITTLE_ENDIAN */
    141 } uqwords;
    142 
    143 typedef union
    144 {
    145     uqwords     u;
    146     long double f;
    147 } long_double_bits;
    148 
    149 #if __STDC_VERSION__ >= 199901L
    150 typedef float _Complex Fcomplex;
    151 typedef double _Complex Dcomplex;
    152 typedef long double _Complex Lcomplex;
    153 
    154 #define COMPLEX_REAL(x) __real__(x)
    155 #define COMPLEX_IMAGINARY(x) __imag__(x)
    156 #else
    157 typedef struct { float real, imaginary; } Fcomplex;
    158 
    159 typedef struct { double real, imaginary; } Dcomplex;
    160 
    161 typedef struct { long double real, imaginary; } Lcomplex;
    162 
    163 #define COMPLEX_REAL(x) (x).real
    164 #define COMPLEX_IMAGINARY(x) (x).imaginary
    165 #endif
    166 #endif /* INT_TYPES_H */
    167 
    168