endian.h revision 330897
1/*-
2 * SPDX-License-Identifier: BSD-3-Clause
3 *
4 * Copyright (c) 1987, 1991, 1993
5 *	The Regents of the University of California.  All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 * 4. Neither the name of the University nor the names of its contributors
16 *    may be used to endorse or promote products derived from this software
17 *    without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 *	@(#)endian.h	8.1 (Berkeley) 6/10/93
32 * $FreeBSD: stable/11/sys/powerpc/include/endian.h 330897 2018-03-14 03:19:51Z eadler $
33 */
34
35#ifndef _MACHINE_ENDIAN_H_
36#define	_MACHINE_ENDIAN_H_
37
38#include <sys/cdefs.h>
39#include <sys/_types.h>
40
41/*
42 * Define the order of 32-bit words in 64-bit words.
43 */
44#ifdef __LITTLE_ENDIAN__
45#define	_QUAD_HIGHWORD 1
46#define	_QUAD_LOWWORD 0
47#else
48#define	_QUAD_HIGHWORD 0
49#define	_QUAD_LOWWORD 1
50#endif
51
52/*
53 * GCC defines _BIG_ENDIAN and _LITTLE_ENDIAN equal to __BIG_ENDIAN__
54 * and __LITTLE_ENDIAN__ (resp).
55 */
56#ifdef _BIG_ENDIAN
57#undef _BIG_ENDIAN
58#endif
59#ifdef _LITTLE_ENDIAN
60#undef _LITTLE_ENDIAN
61#endif
62
63/*
64 * Definitions for byte order, according to byte significance from low
65 * address to high.
66 */
67#define	_LITTLE_ENDIAN	1234	/* LSB first: i386, vax */
68#define	_BIG_ENDIAN	4321	/* MSB first: 68000, ibm, net */
69#define	_PDP_ENDIAN	3412	/* LSB first in word, MSW first in long */
70
71#ifdef __LITTLE_ENDIAN__
72#define	_BYTE_ORDER	_LITTLE_ENDIAN
73#else
74#define	_BYTE_ORDER	_BIG_ENDIAN
75#endif
76
77/*
78 * Deprecated variants that don't have enough underscores to be useful in more
79 * strict namespaces.
80 */
81#if __BSD_VISIBLE
82#define	LITTLE_ENDIAN	_LITTLE_ENDIAN
83#define	BIG_ENDIAN	_BIG_ENDIAN
84#define	PDP_ENDIAN	_PDP_ENDIAN
85#define	BYTE_ORDER	_BYTE_ORDER
86#endif
87
88#if defined(__GNUCLIKE_BUILTIN_CONSTANT_P)
89#define	__is_constant(x)	__builtin_constant_p(x)
90#else
91#define	__is_constant(x)	0
92#endif
93
94#define	__bswap16_const(x)	((((__uint16_t)(x) >> 8) & 0xff) |	\
95	(((__uint16_t)(x) << 8) & 0xff00))
96#define	__bswap32_const(x)	((((__uint32_t)(x) >> 24) & 0xff) |	\
97	(((__uint32_t)(x) >> 8) & 0xff00) |				\
98	(((__uint32_t)(x)<< 8) & 0xff0000) |				\
99	(((__uint32_t)(x) << 24) & 0xff000000))
100#define	__bswap64_const(x)	((((__uint64_t)(x) >> 56) & 0xff) |	\
101	(((__uint64_t)(x) >> 40) & 0xff00) |				\
102	(((__uint64_t)(x) >> 24) & 0xff0000) |				\
103	(((__uint64_t)(x) >> 8) & 0xff000000) |				\
104	(((__uint64_t)(x) << 8) & ((__uint64_t)0xff << 32)) |		\
105	(((__uint64_t)(x) << 24) & ((__uint64_t)0xff << 40)) |		\
106	(((__uint64_t)(x) << 40) & ((__uint64_t)0xff << 48)) |		\
107	(((__uint64_t)(x) << 56) & ((__uint64_t)0xff << 56)))
108
109static __inline __uint16_t
110__bswap16_var(__uint16_t _x)
111{
112
113	return ((_x >> 8) | ((_x << 8) & 0xff00));
114}
115
116static __inline __uint32_t
117__bswap32_var(__uint32_t _x)
118{
119
120	return ((_x >> 24) | ((_x >> 8) & 0xff00) | ((_x << 8) & 0xff0000) |
121	    ((_x << 24) & 0xff000000));
122}
123
124static __inline __uint64_t
125__bswap64_var(__uint64_t _x)
126{
127
128	return ((_x >> 56) | ((_x >> 40) & 0xff00) | ((_x >> 24) & 0xff0000) |
129	    ((_x >> 8) & 0xff000000) | ((_x << 8) & ((__uint64_t)0xff << 32)) |
130	    ((_x << 24) & ((__uint64_t)0xff << 40)) |
131	    ((_x << 40) & ((__uint64_t)0xff << 48)) | ((_x << 56)));
132}
133
134#define	__bswap16(x)	((__uint16_t)(__is_constant(x) ? __bswap16_const(x) : \
135	__bswap16_var(x)))
136#define	__bswap32(x)	(__is_constant(x) ? __bswap32_const(x) : \
137	__bswap32_var(x))
138#define	__bswap64(x)	(__is_constant(x) ? __bswap64_const(x) : \
139	__bswap64_var(x))
140
141#ifdef __LITTLE_ENDIAN__
142#define	__htonl(x)	(__bswap32((__uint32_t)(x)))
143#define	__htons(x)	(__bswap16((__uint16_t)(x)))
144#define	__ntohl(x)	(__bswap32((__uint32_t)(x)))
145#define	__ntohs(x)	(__bswap16((__uint16_t)(x)))
146#else
147#define	__htonl(x)	((__uint32_t)(x))
148#define	__htons(x)	((__uint16_t)(x))
149#define	__ntohl(x)	((__uint32_t)(x))
150#define	__ntohs(x)	((__uint16_t)(x))
151#endif
152
153#endif /* !_MACHINE_ENDIAN_H_ */
154