endian.h (82725ba9bf1fd59746a4006a06f24d4d61d142f2) endian.h (720dc6bcb5a8c4283802576e2ef54f42b33fa8d4)
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

--- 21 unchanged lines hidden (view full) ---

30 *
31 * @(#)endian.h 8.1 (Berkeley) 6/10/93
32 * $FreeBSD$
33 */
34
35#ifndef _MACHINE_ENDIAN_H_
36#define _MACHINE_ENDIAN_H_
37
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

--- 21 unchanged lines hidden (view full) ---

30 *
31 * @(#)endian.h 8.1 (Berkeley) 6/10/93
32 * $FreeBSD$
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/*
38#include <sys/_types.h>
39
40/*
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
41 * GCC defines _BIG_ENDIAN and _LITTLE_ENDIAN equal to __BIG_ENDIAN__
42 * and __LITTLE_ENDIAN__ (resp).
43 */
44#ifdef _BIG_ENDIAN
45#undef _BIG_ENDIAN
46#endif
47#ifdef _LITTLE_ENDIAN
48#undef _LITTLE_ENDIAN
49#endif
50
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 */
51#include <sys/_endian.h>
70
52
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_ */
53#endif /* !_MACHINE_ENDIAN_H_ */