diff options
author | Daniel Dunbar <daniel@zuster.org> | 2009-06-26 16:47:03 +0000 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2009-06-26 16:47:03 +0000 |
commit | b3a6901e66f55b35aa9e01bcb24134e6a65ea004 (patch) | |
tree | 4d57d73575ea3f7e30bf430920d6e96fa2a369c1 /lib/int_lib.h | |
parent | 8cbe163cba77c772621f89ddb33793ac170b1fa2 (diff) | |
download | compiler-rt-b3a6901e66f55b35aa9e01bcb24134e6a65ea004.tar.gz compiler-rt-b3a6901e66f55b35aa9e01bcb24134e6a65ea004.tar.bz2 compiler-rt-b3a6901e66f55b35aa9e01bcb24134e6a65ea004.tar.xz |
Initial import of compiler-rt.
-
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@74292 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/int_lib.h')
-rw-r--r-- | lib/int_lib.h | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/lib/int_lib.h b/lib/int_lib.h new file mode 100644 index 00000000..7d09c856 --- /dev/null +++ b/lib/int_lib.h @@ -0,0 +1,143 @@ +//===-- int_lib.h - configuration header for libgcc replacement -----------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file is a configuration header for libgcc replacement. +// This file is not part of the interface of this library. +// +//===----------------------------------------------------------------------===// + +#ifndef INT_LIB_H +#define INT_LIB_H + +// Assumption: signed integral is 2's complement +// Assumption: right shift of signed negative is arithmetic shift + +#include <limits.h> + +#ifdef __LITTLE_ENDIAN__ +#if __LITTLE_ENDIAN__ +#define _YUGA_LITTLE_ENDIAN 1 +#define _YUGA_BIG_ENDIAN 0 +#endif +#endif + +#ifdef __BIG_ENDIAN__ +#if __BIG_ENDIAN__ +#define _YUGA_LITTLE_ENDIAN 0 +#define _YUGA_BIG_ENDIAN 1 +#endif +#endif + +#if !defined(_YUGA_LITTLE_ENDIAN) || !defined(_YUGA_BIG_ENDIAN) +#error unable to determine endian +#endif + +typedef int si_int; +typedef unsigned su_int; + +typedef long long di_int; +typedef unsigned long long du_int; + +typedef union +{ + di_int all; + struct + { +#if _YUGA_LITTLE_ENDIAN + su_int low; + si_int high; +#else + si_int high; + su_int low; +#endif + }; +} dwords; + +typedef union +{ + du_int all; + struct + { +#if _YUGA_LITTLE_ENDIAN + su_int low; + su_int high; +#else + su_int high; + su_int low; +#endif + }; +} udwords; + +#if __x86_64 + +typedef int ti_int __attribute__ ((mode (TI))); +typedef unsigned tu_int __attribute__ ((mode (TI))); + +typedef union +{ + ti_int all; + struct + { +#if _YUGA_LITTLE_ENDIAN + du_int low; + di_int high; +#else + di_int high; + du_int low; +#endif + }; +} twords; + +typedef union +{ + tu_int all; + struct + { +#if _YUGA_LITTLE_ENDIAN + du_int low; + du_int high; +#else + du_int high; + du_int low; +#endif + }; +} utwords; + +#endif + +typedef union +{ + su_int u; + float f; +} float_bits; + +typedef union +{ + udwords u; + double f; +} double_bits; + +typedef struct +{ +#if _YUGA_LITTLE_ENDIAN + udwords low; + udwords high; +#else + udwords high; + udwords low; +#endif +} uqwords; + +typedef union +{ + uqwords u; + long double f; +} long_double_bits; + +#endif |