master
  1/*
  2 * Copyright (c) 2006-2023 Apple Inc. All rights reserved.
  3 *
  4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  5 *
  6 * This file contains Original Code and/or Modifications of Original Code
  7 * as defined in and that are subject to the Apple Public Source License
  8 * Version 2.0 (the 'License'). You may not use this file except in
  9 * compliance with the License. The rights granted to you under the License
 10 * may not be used to create, or enable the creation or redistribution of,
 11 * unlawful or unlicensed copies of an Apple operating system, or to
 12 * circumvent, violate, or enable the circumvention or violation of, any
 13 * terms of an Apple operating system software license agreement.
 14 *
 15 * Please obtain a copy of the License at
 16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
 17 *
 18 * The Original Code and all software distributed under the License are
 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 23 * Please see the License for the specific language governing rights and
 24 * limitations under the License.
 25 *
 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
 27 */
 28
 29#ifndef _OS__OSBYTEORDERI386_H
 30#define _OS__OSBYTEORDERI386_H
 31
 32#if defined(__i386__) || defined(__x86_64__)
 33
 34#include <sys/_types.h>
 35
 36#if !defined(__DARWIN_OS_INLINE)
 37# if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
 38#        define __DARWIN_OS_INLINE static inline
 39# elif defined(__MWERKS__) || defined(__cplusplus)
 40#        define __DARWIN_OS_INLINE static inline
 41# else
 42#        define __DARWIN_OS_INLINE static __inline__
 43# endif
 44#endif
 45
 46/* Generic byte swapping functions. */
 47
 48__DARWIN_OS_INLINE
 49__uint16_t
 50_OSSwapInt16(
 51	__uint16_t        _data
 52	)
 53{
 54	return (__uint16_t)((_data << 8) | (_data >> 8));
 55}
 56
 57__DARWIN_OS_INLINE
 58__uint32_t
 59_OSSwapInt32(
 60	__uint32_t        _data
 61	)
 62{
 63#if defined(__llvm__)
 64	return __builtin_bswap32(_data);
 65#else
 66	__asm__ ("bswap   %0" : "+r" (_data));
 67	return _data;
 68#endif
 69}
 70
 71#if defined(__llvm__)
 72__DARWIN_OS_INLINE
 73__uint64_t
 74_OSSwapInt64(
 75	__uint64_t        _data
 76	)
 77{
 78	return __builtin_bswap64(_data);
 79}
 80
 81#elif defined(__i386__)
 82__DARWIN_OS_INLINE
 83__uint64_t
 84_OSSwapInt64(
 85	__uint64_t        _data
 86	)
 87{
 88	__asm__ ("bswap   %%eax\n\t"
 89                 "bswap   %%edx\n\t"
 90                 "xchgl   %%eax, %%edx"
 91                 : "+A" (_data));
 92	return _data;
 93}
 94#elif defined(__x86_64__)
 95__DARWIN_OS_INLINE
 96__uint64_t
 97_OSSwapInt64(
 98	__uint64_t        _data
 99	)
100{
101	__asm__ ("bswap   %0" : "+r" (_data));
102	return _data;
103}
104#else
105#error Unknown architecture
106#endif
107
108#endif /* defined(__i386__) || defined(__x86_64__) */
109
110#endif /* ! _OS__OSBYTEORDERI386_H */