ROOT
6.12/07
Reference Guide
core
base
inc
Byteswap.h
Go to the documentation of this file.
1
/* @(#)root/base:$Id$ */
2
3
/*************************************************************************
4
* Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
5
* All rights reserved. *
6
* *
7
* For the licensing terms see $ROOTSYS/LICENSE. *
8
* For the list of contributors see $ROOTSYS/README/CREDITS. *
9
*************************************************************************/
10
11
#ifndef ROOT_Byteswap
12
#define ROOT_Byteswap
13
14
/* Copyright (C) 1997 Free Software Foundation, Inc.
15
This file is part of the GNU C Library.
16
17
The GNU C Library is free software; you can redistribute it and/or
18
modify it under the terms of the GNU Library General Public License as
19
published by the Free Software Foundation; either version 2 of the
20
License, or (at your option) any later version.
21
22
The GNU C Library is distributed in the hope that it will be useful,
23
but WITHOUT ANY WARRANTY; without even the implied warranty of
24
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25
Library General Public License for more details.
26
27
You should have received a copy of the GNU Library General Public
28
License along with the GNU C Library; see the file COPYING.LIB. If not,
29
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
30
Boston, MA 02111-1307, USA. */
31
32
#if (defined(__linux) || defined(__APPLE__)) && \
33
(defined(__i386__) || defined(__x86_64__)) && \
34
(defined(__GNUC__) && __GNUC__ >= 2)
35
#ifndef R__USEASMSWAP
36
#define R__USEASMSWAP
37
#endif
38
#endif
39
40
/* Get the machine specific, optimized definitions. */
41
/* The following is copied from <bits/byteswap.h> (only from RH6.0 and above) */
42
43
/* Swap bytes in 16 bit value. */
44
#define R__bswap_constant_16(x) \
45
((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))
46
47
#if defined R__USEASMSWAP
48
# define R__bswap_16(x) \
49
(__extension__ \
50
({ unsigned short int __v; \
51
if (__builtin_constant_p (x)) \
52
__v = R__bswap_constant_16 (x); \
53
else \
54
__asm__ __volatile__ ("rorw $8, %w0" \
55
: "=r" (__v) \
56
: "0" ((unsigned short int) (x)) \
57
: "cc"); \
58
__v; }))
59
#else
60
/* This is better than nothing. */
61
# define R__bswap_16(x) R__bswap_constant_16 (x)
62
#endif
63
64
65
/* Swap bytes in 32 bit value. */
66
#define R__bswap_constant_32(x) \
67
((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) | \
68
(((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24))
69
70
#if defined R__USEASMSWAP
71
/* To swap the bytes in a word the i486 processors and up provide the
72
`bswap' opcode. On i386 we have to use three instructions. */
73
# if !defined __i486__ && !defined __pentium__ && !defined __pentiumpro__ && \
74
!defined __pentium4__ && !defined __x86_64__
75
# define R__bswap_32(x) \
76
(__extension__ \
77
({ unsigned int __v; \
78
if (__builtin_constant_p (x)) \
79
__v = R__bswap_constant_32 (x); \
80
else \
81
__asm__ __volatile__ ("rorw $8, %w0;" \
82
"rorl $16, %0;" \
83
"rorw $8, %w0" \
84
: "=r" (__v) \
85
: "0" ((unsigned int) (x)) \
86
: "cc"); \
87
__v; }))
88
# else
89
# define R__bswap_32(x) \
90
(__extension__ \
91
({ unsigned int __v; \
92
if (__builtin_constant_p (x)) \
93
__v = R__bswap_constant_32 (x); \
94
else \
95
__asm__ __volatile__ ("bswap %0" \
96
: "=r" (__v) \
97
: "0" ((unsigned int) (x))); \
98
__v; }))
99
# endif
100
#else
101
# define R__bswap_32(x) R__bswap_constant_32 (x)
102
#endif
103
104
105
#if defined __GNUC__ && __GNUC__ >= 2
106
/* Swap bytes in 64 bit value. */
107
# define R__bswap_64(x) \
108
(__extension__ \
109
({ union { __extension__ unsigned long long int __ll; \
110
UInt_t __l[2]; } __w, __r; \
111
__w.__ll = (x); \
112
__r.__l[0] = R__bswap_32 (__w.__l[1]); \
113
__r.__l[1] = R__bswap_32 (__w.__l[0]); \
114
__r.__ll; }))
115
#endif
/* bits/byteswap.h */
116
117
118
/* The following definitions must all be macros since otherwise some
119
of the possible optimizations are not possible. */
120
121
/* Return a value with all bytes in the 16 bit argument swapped. */
122
#define Rbswap_16(x) R__bswap_16 (x)
123
124
/* Return a value with all bytes in the 32 bit argument swapped. */
125
#define Rbswap_32(x) R__bswap_32 (x)
126
127
#if defined __GNUC__ && __GNUC__ >= 2
128
/* Return a value with all bytes in the 64 bit argument swapped. */
129
# define Rbswap_64(x) R__bswap_64 (x)
130
#endif
131
132
#endif
/* Byteswap.h */