]> git.donarmstrong.com Git - mothur.git/blob - endiannessmacros.h
sffinfo command is working
[mothur.git] / endiannessmacros.h
1 #ifndef EDIANNESSMACROS_H
2 #define EDIANNESSMACROS_H
3
4 /*
5  *   endiannessmacros.h
6  *  Mothur
7  *
8  *  Created by westcott on 7/9/10.
9  *  Copyright 2010 Schloss Lab. All rights reserved.
10  *
11  */
12  
13 /*********************************************************************/
14 /*********************************************************************/
15 // The following is copied from the staden io_lib-1.12.4 os.h - thanks!
16 /*********************************************************************/
17 /*********************************************************************/
18
19 /*
20  * Author: 
21  *         MRC Laboratory of Molecular Biology
22  *         Hills Road
23  *         Cambridge CB2 2QH
24  *         United Kingdom
25  *
26  * Description: operating system specific type definitions
27  *
28  */
29
30 #include <limits.h>
31 #include <inttypes.h>
32
33 /*-----------------------------------------------------------------------------
34  * Detection of endianness. The main part of this is done in autoconf, but
35  * for the case of MacOS FAT binaries we fall back on auto-sensing based on
36  * processor type too.
37  */
38
39 /* Set by autoconf */
40 #define SP_LITTLE_ENDIAN
41
42 /* Mac FAT binaries or unknown. Auto detect based on CPU type */
43 #if !defined(SP_BIG_ENDIAN) && !defined(SP_LITTLE_ENDIAN)
44
45 /*
46  * x86 equivalents
47  */
48 #if defined(__i386__) || defined(__i386) || defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64) || defined(__i686__) || defined(__i686)
49 #  if defined(SP_BIG_ENDIAN)
50 #    undef SP_BIG_ENDIAN
51 #  endif
52 #  define SP_LITTLE_ENDIAN
53 #endif
54
55 /*
56  * DEC Alpha
57  */
58 #if defined(__alpha__) || defined(__alpha)
59 #  if defined(SP_LITTLE_ENDIAN)
60 #    undef SP_LITTLE_ENDIAN
61 #  endif
62 #  define SP_BIG_ENDIAN
63 #endif
64
65 /*
66  * SUN Sparc
67  */
68 #if defined(__sparc__) || defined(__sparc)
69 #  if defined(SP_LITTLE_ENDIAN)
70 #    undef SP_LITTLE_ENDIAN
71 #  endif
72 #  define SP_BIG_ENDIAN
73 #endif
74
75 /*
76  * PowerPC
77  */
78 #if defined(__ppc__) || defined(__ppc)
79 #  if defined(SP_LITTLE_ENDIAN)
80 #    undef SP_LITTLE_ENDIAN
81 #  endif
82 #  define SP_BIG_ENDIAN
83 #endif
84
85 /* Some catch-alls */
86 #if defined(__LITTLE_ENDIAN__) || defined(__LITTLEENDIAN__)
87 #    define SP_LITTLE_ENDIAN
88 #endif
89
90 #if defined(__BIG_ENDIAN__) || defined(__BIGENDIAN__)
91 #    define SP_BIG_ENDIAN
92 #endif
93
94 #if defined(SP_BIG_ENDIAN) && defined(SP_LITTLE_ENDIAN)
95 #    error Both BIG and LITTLE endian defined. Fix os.h and/or Makefile
96 #endif
97
98 #if !defined(SP_BIG_ENDIAN) && !defined(SP_LITTLE_ENDIAN)
99 #    error Neither BIG nor LITTLE endian defined. Fix os.h and/or Makefile
100 #endif
101
102 #endif
103
104 /*-----------------------------------------------------------------------------
105  * Byte swapping macros
106  */
107
108 /*
109  * Our new swap runs at the same speed on Ultrix, but substantially faster
110  * (300% for swap_int4, ~50% for swap_int2) on an Alpha (due to the lack of
111  * decent 'char' support).
112  *
113  * They also have the ability to swap in situ (src == dst). Newer code now
114  * relies on this so don't change back!
115  */
116 #define iswap_int8(x) \
117     (((x & 0x00000000000000ffLL) << 56) + \
118      ((x & 0x000000000000ff00LL) << 40) + \
119      ((x & 0x0000000000ff0000LL) << 24) + \
120      ((x & 0x00000000ff000000LL) <<  8) + \
121      ((x & 0x000000ff00000000LL) >>  8) + \
122      ((x & 0x0000ff0000000000LL) >> 24) + \
123      ((x & 0x00ff000000000000LL) >> 40) + \
124      ((x & 0xff00000000000000LL) >> 56))
125
126 #define iswap_int4(x) \
127     (((x & 0x000000ff) << 24) + \
128      ((x & 0x0000ff00) <<  8) + \
129      ((x & 0x00ff0000) >>  8) + \
130      ((x & 0xff000000) >> 24))
131
132 #define iswap_int2(x) \
133     (((x & 0x00ff) << 8) + \
134      ((x & 0xff00) >> 8))
135
136 #define swap_int8(src, dst) ((dst) = iswap_int8(src))
137 #define swap_int4(src, dst) ((dst) = iswap_int4(src))
138 #define swap_int2(src, dst) ((dst) = iswap_int2(src))
139
140
141 /*
142  * Linux systems may use byteswap.h to get assembly versions of byte-swap
143  * on intel systems. This can be as trivial as the bswap opcode, which works
144  * out at over 2-times faster than iswap_int4 above.
145  */
146 #if 0
147 #if defined(__linux__)
148 #    include <byteswap.h>
149 #    undef iswap_int8
150 #    undef iswap_int4
151 #    undef iswap_int2
152 #    define iswap_int8 bswap_64
153 #    define iswap_int4 bswap_32
154 #    define iswap_int2 bswap_16
155 #endif
156 #endif
157
158
159 /*
160  * Macros to specify that data read in is of a particular endianness.
161  * The macros here swap to the appropriate order for the particular machine
162  * running the macro and return the new answer. These may also be used when
163  * writing to a file to specify that we wish to write in (eg) big endian
164  * format.
165  *
166  * This leads to efficient code as most of the time these macros are
167  * trivial.
168  */
169 #ifdef SP_BIG_ENDIAN
170 #define be_int8(x) (x)
171 #define be_int4(x) (x)
172 #define be_int2(x) (x)
173 #define be_int1(x) (x)
174
175 #define le_int8(x) iswap_int8((x))
176 #define le_int4(x) iswap_int4((x))
177 #define le_int2(x) iswap_int2((x))
178 #define le_int1(x) (x)
179 #endif
180
181 #ifdef SP_LITTLE_ENDIAN
182 #define be_int8(x) iswap_int8((x))
183 #define be_int4(x) iswap_int4((x))
184 #define be_int2(x) iswap_int2((x))
185 #define be_int1(x) (x)
186
187 #define le_int8(x) (x)
188 #define le_int4(x) (x)
189 #define le_int2(x) (x)
190 #define le_int1(x) (x)
191 #endif
192
193 #endif