genericopenlibs/openenvcore/include/machine/endian.h
changeset 0 e4d67989cc36
equal deleted inserted replaced
-1:000000000000 0:e4d67989cc36
       
     1 /*-
       
     2  * Copyright (c) 1987, 1991 Regents of the University of California.
       
     3  * All rights reserved.
       
     4  *
       
     5  * Redistribution and use in source and binary forms, with or without
       
     6  * modification, are permitted provided that the following conditions
       
     7  * are met:
       
     8  * 1. Redistributions of source code must retain the above copyright
       
     9  *    notice, this list of conditions and the following disclaimer.
       
    10  * 2. Redistributions in binary form must reproduce the above copyright
       
    11  *    notice, this list of conditions and the following disclaimer in the
       
    12  *    documentation and/or other materials provided with the distribution.
       
    13  * 4. Neither the name of the University nor the names of its contributors
       
    14  *    may be used to endorse or promote products derived from this software
       
    15  *    without specific prior written permission.
       
    16  *
       
    17  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
       
    18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
       
    20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
       
    21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
       
    22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
       
    23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
       
    24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
       
    25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
       
    26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
       
    27  * SUCH DAMAGE.
       
    28  *
       
    29  *	@(#)endian.h	7.8 (Berkeley) 4/3/91
       
    30  * $FreeBSD: src/sys/i386/include/endian.h,v 1.41 2005/03/02 21:33:26 joerg Exp $
       
    31  */
       
    32 
       
    33 #ifndef _MACHINE_ENDIAN_H_
       
    34 #define	_MACHINE_ENDIAN_H_
       
    35 
       
    36 #include <sys/cdefs.h>
       
    37 #include <sys/_types.h>
       
    38 
       
    39 #ifdef __cplusplus
       
    40 extern "C" {
       
    41 #endif
       
    42 
       
    43 /*
       
    44  * Define the order of 32-bit words in 64-bit words.
       
    45  */
       
    46 #define	_QUAD_HIGHWORD 1
       
    47 #define	_QUAD_LOWWORD 0
       
    48 
       
    49 /*
       
    50  * Definitions for byte order, according to byte significance from low
       
    51  * address to high.
       
    52  */
       
    53 #define	_LITTLE_ENDIAN	1234	/* LSB first: i386, vax */
       
    54 #define	_BIG_ENDIAN	4321	/* MSB first: 68000, ibm, net */
       
    55 #define	_PDP_ENDIAN	3412	/* LSB first in word, MSW first in long */
       
    56 
       
    57 #define	_BYTE_ORDER	_LITTLE_ENDIAN
       
    58 
       
    59 /*
       
    60  * Deprecated variants that don't have enough underscores to be useful in more
       
    61  * strict namespaces.
       
    62  */
       
    63 #if __BSD_VISIBLE
       
    64 #define	LITTLE_ENDIAN	_LITTLE_ENDIAN
       
    65 #define	BIG_ENDIAN	_BIG_ENDIAN
       
    66 #define	PDP_ENDIAN	_PDP_ENDIAN
       
    67 #define	BYTE_ORDER	_BYTE_ORDER
       
    68 #endif
       
    69 
       
    70 #ifdef __SYMBIAN32__
       
    71 
       
    72 #define	_BYTEORDER_FUNC_DEFINED
       
    73 
       
    74 #else /* __SYMBIAN32__ */
       
    75 
       
    76 #if defined(__GNUCLIKE_ASM) && defined(__GNUCLIKE_BUILTIN_CONSTANT_P)
       
    77 
       
    78 #define __word_swap_int_var(x) \
       
    79 __extension__ ({ register __uint32_t __X = (x); \
       
    80    __asm ("rorl $16, %0" : "+r" (__X)); \
       
    81    __X; })
       
    82 
       
    83 #ifdef __OPTIMIZE__
       
    84 
       
    85 #define	__word_swap_int_const(x) \
       
    86 	((((x) & 0xffff0000) >> 16) | \
       
    87 	 (((x) & 0x0000ffff) << 16))
       
    88 #define	__word_swap_int(x) (__builtin_constant_p(x) ? \
       
    89 	__word_swap_int_const(x) : __word_swap_int_var(x))
       
    90 
       
    91 #else	/* __OPTIMIZE__ */
       
    92 
       
    93 #define	__word_swap_int(x) __word_swap_int_var(x)
       
    94 
       
    95 #endif	/* __OPTIMIZE__ */
       
    96 
       
    97 #define __byte_swap_int_var(x) \
       
    98 __extension__ ({ register __uint32_t __X = (x); \
       
    99    __asm ("bswap %0" : "+r" (__X)); \
       
   100    __X; })
       
   101 
       
   102 #ifdef __OPTIMIZE__
       
   103 
       
   104 #define	__byte_swap_int_const(x) \
       
   105 	((((x) & 0xff000000) >> 24) | \
       
   106 	 (((x) & 0x00ff0000) >>  8) | \
       
   107 	 (((x) & 0x0000ff00) <<  8) | \
       
   108 	 (((x) & 0x000000ff) << 24))
       
   109 #define	__byte_swap_int(x) (__builtin_constant_p(x) ? \
       
   110 	__byte_swap_int_const(x) : __byte_swap_int_var(x))
       
   111 
       
   112 #else	/* __OPTIMIZE__ */
       
   113 
       
   114 #define	__byte_swap_int(x) __byte_swap_int_var(x)
       
   115 
       
   116 #endif	/* __OPTIMIZE__ */
       
   117 
       
   118 #define __byte_swap_word_var(x) \
       
   119 __extension__ ({ register __uint16_t __X = (x); \
       
   120    __asm ("xchgb %h0, %b0" : "+q" (__X)); \
       
   121    __X; })
       
   122 
       
   123 #ifdef __OPTIMIZE__
       
   124 
       
   125 #define	__byte_swap_word_const(x) \
       
   126 	((((x) & 0xff00) >> 8) | \
       
   127 	 (((x) & 0x00ff) << 8))
       
   128 
       
   129 #define	__byte_swap_word(x) (__builtin_constant_p(x) ? \
       
   130 	__byte_swap_word_const(x) : __byte_swap_word_var(x))
       
   131 
       
   132 #else	/* __OPTIMIZE__ */
       
   133 
       
   134 #define	__byte_swap_word(x) __byte_swap_word_var(x)
       
   135 
       
   136 #endif	/* __OPTIMIZE__ */
       
   137 
       
   138 static __inline __uint64_t
       
   139 __bswap64(__uint64_t _x)
       
   140 {
       
   141 
       
   142 	return ((_x >> 56) | ((_x >> 40) & 0xff00) | ((_x >> 24) & 0xff0000) |
       
   143 	    ((_x >> 8) & 0xff000000) | ((_x << 8) & ((__uint64_t)0xff << 32)) |
       
   144 	    ((_x << 24) & ((__uint64_t)0xff << 40)) |
       
   145 	    ((_x << 40) & ((__uint64_t)0xff << 48)) | ((_x << 56)));
       
   146 }
       
   147 
       
   148 static __inline __uint32_t
       
   149 __bswap32(__uint32_t _x)
       
   150 {
       
   151 
       
   152 	return (__byte_swap_int(_x));
       
   153 }
       
   154 
       
   155 static __inline __uint16_t
       
   156 __bswap16(__uint16_t _x)
       
   157 {
       
   158 
       
   159 	return (__byte_swap_word(_x));
       
   160 }
       
   161 
       
   162 #define	__htonl(x)	__bswap32(x)
       
   163 #define	__htons(x)	__bswap16(x)
       
   164 #define	__ntohl(x)	__bswap32(x)
       
   165 #define	__ntohs(x)	__bswap16(x)
       
   166 
       
   167 #else /* !(__GNUCLIKE_ASM && __GNUCLIKE_BUILTIN_CONSTANT_P) */
       
   168 
       
   169 /*
       
   170  * No optimizations are available for this compiler.  Fall back to
       
   171  * non-optimized functions by defining the constant usually used to prevent
       
   172  * redefinition.
       
   173  */
       
   174 #define	_BYTEORDER_FUNC_DEFINED
       
   175 
       
   176 #endif /* __GNUCLIKE_ASM && __GNUCLIKE_BUILTIN_CONSTANT_P */
       
   177 #endif /* __SYMBIAN32__ */
       
   178 
       
   179 #ifdef __cplusplus
       
   180 }
       
   181 #endif
       
   182 
       
   183 #endif /* !_MACHINE_ENDIAN_H_ */