Home | History | Annotate | Download | only in lib
      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 typedef      int si_int;
     24 typedef unsigned su_int;
     25 
     26 typedef          long long di_int;
     27 typedef unsigned long long du_int;
     28 
     29 typedef union
     30 {
     31     di_int all;
     32     struct
     33     {
     34 #if _YUGA_LITTLE_ENDIAN
     35         su_int low;
     36         si_int high;
     37 #else
     38         si_int high;
     39         su_int low;
     40 #endif /* _YUGA_LITTLE_ENDIAN */
     41     }s;
     42 } dwords;
     43 
     44 typedef union
     45 {
     46     du_int all;
     47     struct
     48     {
     49 #if _YUGA_LITTLE_ENDIAN
     50         su_int low;
     51         su_int high;
     52 #else
     53         su_int high;
     54         su_int low;
     55 #endif /* _YUGA_LITTLE_ENDIAN */
     56     }s;
     57 } udwords;
     58 
     59 #if __x86_64
     60 
     61 typedef int      ti_int __attribute__ ((mode (TI)));
     62 typedef unsigned tu_int __attribute__ ((mode (TI)));
     63 
     64 typedef union
     65 {
     66     ti_int all;
     67     struct
     68     {
     69 #if _YUGA_LITTLE_ENDIAN
     70         du_int low;
     71         di_int high;
     72 #else
     73         di_int high;
     74         du_int low;
     75 #endif /* _YUGA_LITTLE_ENDIAN */
     76     }s;
     77 } twords;
     78 
     79 typedef union
     80 {
     81     tu_int all;
     82     struct
     83     {
     84 #if _YUGA_LITTLE_ENDIAN
     85         du_int low;
     86         du_int high;
     87 #else
     88         du_int high;
     89         du_int low;
     90 #endif /* _YUGA_LITTLE_ENDIAN */
     91     }s;
     92 } utwords;
     93 
     94 static inline ti_int make_ti(di_int h, di_int l) {
     95     twords r;
     96     r.s.high = h;
     97     r.s.low = l;
     98     return r.all;
     99 }
    100 
    101 static inline tu_int make_tu(du_int h, du_int l) {
    102     utwords r;
    103     r.s.high = h;
    104     r.s.low = l;
    105     return r.all;
    106 }
    107 
    108 #endif /* __x86_64 */
    109 
    110 typedef union
    111 {
    112     su_int u;
    113     float f;
    114 } float_bits;
    115 
    116 typedef union
    117 {
    118     udwords u;
    119     double  f;
    120 } double_bits;
    121 
    122 typedef struct
    123 {
    124 #if _YUGA_LITTLE_ENDIAN
    125     udwords low;
    126     udwords high;
    127 #else
    128     udwords high;
    129     udwords low;
    130 #endif /* _YUGA_LITTLE_ENDIAN */
    131 } uqwords;
    132 
    133 typedef union
    134 {
    135     uqwords     u;
    136     long double f;
    137 } long_double_bits;
    138 
    139 #endif /* INT_TYPES_H */
    140 
    141