epoc32/include/stdapis/machine/endian.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
parent 0 061f57f2323e
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
     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_ */