xref: /dflybsd-src/contrib/binutils-2.34/libctf/swap.h (revision b52ef7118d1621abed722c5bbbd542210290ecef)
1*fae548d3Szrj /* Interface to byteswapping functions.
2*fae548d3Szrj    Copyright (C) 2006-2020 Free Software Foundation, Inc.
3*fae548d3Szrj 
4*fae548d3Szrj    This file is part of libctf.
5*fae548d3Szrj 
6*fae548d3Szrj    libctf is free software; you can redistribute it and/or modify it under
7*fae548d3Szrj    the terms of the GNU General Public License as published by the Free
8*fae548d3Szrj    Software Foundation; either version 3, or (at your option) any later
9*fae548d3Szrj    version.
10*fae548d3Szrj 
11*fae548d3Szrj    This program is distributed in the hope that it will be useful, but
12*fae548d3Szrj    WITHOUT ANY WARRANTY; without even the implied warranty of
13*fae548d3Szrj    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14*fae548d3Szrj    See the GNU General Public License for more details.
15*fae548d3Szrj 
16*fae548d3Szrj    You should have received a copy of the GNU General Public License
17*fae548d3Szrj    along with this program; see the file COPYING.  If not see
18*fae548d3Szrj    <http://www.gnu.org/licenses/>.  */
19*fae548d3Szrj 
20*fae548d3Szrj #ifndef _CTF_SWAP_H
21*fae548d3Szrj #define _CTF_SWAP_H
22*fae548d3Szrj 
23*fae548d3Szrj #include "config.h"
24*fae548d3Szrj #include <stdint.h>
25*fae548d3Szrj 
26*fae548d3Szrj #ifdef HAVE_BYTESWAP_H
27*fae548d3Szrj #include <byteswap.h>
28*fae548d3Szrj #else
29*fae548d3Szrj 
30*fae548d3Szrj /* Provide our own versions of the byteswap functions.  */
31*fae548d3Szrj static inline uint16_t
bswap_16(uint16_t v)32*fae548d3Szrj bswap_16 (uint16_t v)
33*fae548d3Szrj {
34*fae548d3Szrj   return ((v >> 8) & 0xff) | ((v & 0xff) << 8);
35*fae548d3Szrj }
36*fae548d3Szrj 
37*fae548d3Szrj static inline uint32_t
bswap_32(uint32_t v)38*fae548d3Szrj bswap_32 (uint32_t v)
39*fae548d3Szrj {
40*fae548d3Szrj   return (  ((v & 0xff000000) >> 24)
41*fae548d3Szrj 	  | ((v & 0x00ff0000) >>  8)
42*fae548d3Szrj 	  | ((v & 0x0000ff00) <<  8)
43*fae548d3Szrj 	  | ((v & 0x000000ff) << 24));
44*fae548d3Szrj }
45*fae548d3Szrj 
46*fae548d3Szrj inline uint64_t
bswap_identity_64(uint64_t v)47*fae548d3Szrj bswap_identity_64 (uint64_t v)
48*fae548d3Szrj {
49*fae548d3Szrj   return v;
50*fae548d3Szrj }
51*fae548d3Szrj 
52*fae548d3Szrj static inline uint64_t
bswap_64(uint64_t v)53*fae548d3Szrj bswap_64 (uint64_t v)
54*fae548d3Szrj {
55*fae548d3Szrj   return (  ((v & 0xff00000000000000ULL) >> 56)
56*fae548d3Szrj 	  | ((v & 0x00ff000000000000ULL) >> 40)
57*fae548d3Szrj 	  | ((v & 0x0000ff0000000000ULL) >> 24)
58*fae548d3Szrj 	  | ((v & 0x000000ff00000000ULL) >>  8)
59*fae548d3Szrj 	  | ((v & 0x00000000ff000000ULL) <<  8)
60*fae548d3Szrj 	  | ((v & 0x0000000000ff0000ULL) << 24)
61*fae548d3Szrj 	  | ((v & 0x000000000000ff00ULL) << 40)
62*fae548d3Szrj 	  | ((v & 0x00000000000000ffULL) << 56));
63*fae548d3Szrj }
64*fae548d3Szrj #endif /* !defined(HAVE_BYTESWAP_H) */
65*fae548d3Szrj 
66*fae548d3Szrj #endif /* !defined(_CTF_SWAP_H) */
67