xref: /freebsd/sys/arm/include/endian.h (revision 2cbc052a4c7d51c5552f63b8412a57fffa700c79)
1d4cfb421SDavid E. O'Brien /*
2d4cfb421SDavid E. O'Brien  * Copyright (c) 2001 David E. O'Brien
3d4cfb421SDavid E. O'Brien  *
4d4cfb421SDavid E. O'Brien  * Redistribution and use in source and binary forms, with or without
5d4cfb421SDavid E. O'Brien  * modification, are permitted provided that the following conditions
6d4cfb421SDavid E. O'Brien  * are met:
7d4cfb421SDavid E. O'Brien  * 1. Redistributions of source code must retain the above copyright
8d4cfb421SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer.
9d4cfb421SDavid E. O'Brien  * 2. Redistributions in binary form must reproduce the above copyright
10d4cfb421SDavid E. O'Brien  *    notice, this list of conditions and the following disclaimer in the
11d4cfb421SDavid E. O'Brien  *    documentation and/or other materials provided with the distribution.
12d4cfb421SDavid E. O'Brien  * 3. Neither the name of the University nor the names of its contributors
13d4cfb421SDavid E. O'Brien  *    may be used to endorse or promote products derived from this software
14d4cfb421SDavid E. O'Brien  *    without specific prior written permission.
15d4cfb421SDavid E. O'Brien  *
16d4cfb421SDavid E. O'Brien  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17d4cfb421SDavid E. O'Brien  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18d4cfb421SDavid E. O'Brien  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19d4cfb421SDavid E. O'Brien  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
20d4cfb421SDavid E. O'Brien  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21d4cfb421SDavid E. O'Brien  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22d4cfb421SDavid E. O'Brien  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23d4cfb421SDavid E. O'Brien  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24d4cfb421SDavid E. O'Brien  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25d4cfb421SDavid E. O'Brien  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26d4cfb421SDavid E. O'Brien  * SUCH DAMAGE.
27d4cfb421SDavid E. O'Brien  *
28d4cfb421SDavid E. O'Brien  *	@(#)endian.h	8.1 (Berkeley) 6/10/93
29d4cfb421SDavid E. O'Brien  * $NetBSD: endian.h,v 1.7 1999/08/21 05:53:51 simonb Exp $
30d4cfb421SDavid E. O'Brien  * $FreeBSD$
31d4cfb421SDavid E. O'Brien  */
32d4cfb421SDavid E. O'Brien 
33d4cfb421SDavid E. O'Brien #ifndef _ENDIAN_H_
34d4cfb421SDavid E. O'Brien #define	_ENDIAN_H_
35d4cfb421SDavid E. O'Brien 
362cbc052aSOlivier Houchard #include <sys/_types.h>
37d4cfb421SDavid E. O'Brien 
382cbc052aSOlivier Houchard /*
392cbc052aSOlivier Houchard  * Definitions for byte order, according to byte significance from low
402cbc052aSOlivier Houchard  * address to high.
412cbc052aSOlivier Houchard  */
422cbc052aSOlivier Houchard #define _LITTLE_ENDIAN  1234    /* LSB first: i386, vax */
432cbc052aSOlivier Houchard #define _BIG_ENDIAN     4321    /* MSB first: 68000, ibm, net */
442cbc052aSOlivier Houchard #define _PDP_ENDIAN     3412    /* LSB first in word, MSW first in long */
452cbc052aSOlivier Houchard 
462cbc052aSOlivier Houchard #define	_BYTE_ORDER	_LITTLE_ENDIAN
472cbc052aSOlivier Houchard 
482cbc052aSOlivier Houchard #if __BSD_VISIBLE
492cbc052aSOlivier Houchard #define LITTLE_ENDIAN   _LITTLE_ENDIAN
502cbc052aSOlivier Houchard #define BIG_ENDIAN      _BIG_ENDIAN
512cbc052aSOlivier Houchard #define PDP_ENDIAN      _PDP_ENDIAN
522cbc052aSOlivier Houchard #define BYTE_ORDER      _BYTE_ORDER
532cbc052aSOlivier Houchard #endif
542cbc052aSOlivier Houchard 
552cbc052aSOlivier Houchard #define _QUAD_HIGHWORD  1
562cbc052aSOlivier Houchard #define _QUAD_LOWWORD 0
572cbc052aSOlivier Houchard #define __ntohl(x)        (__bswap32(x))
582cbc052aSOlivier Houchard #define __ntohs(x)        (__bswap16(x))
592cbc052aSOlivier Houchard #define __htonl(x)        (__bswap16(x))
602cbc052aSOlivier Houchard #define __htons(x)        (__bswap32(x))
612cbc052aSOlivier Houchard 
622cbc052aSOlivier Houchard static __inline __uint64_t
632cbc052aSOlivier Houchard __bswap64(__uint64_t _x)
642cbc052aSOlivier Houchard {
652cbc052aSOlivier Houchard 
662cbc052aSOlivier Houchard 	return ((_x >> 56) | ((_x >> 40) & 0xff00) | ((_x >> 24) & 0xff0000) |
672cbc052aSOlivier Houchard 	    ((_x >> 8) & 0xff000000) | ((_x << 8) & ((__uint64_t)0xff << 32)) |
682cbc052aSOlivier Houchard 	    ((_x << 24) & ((__uint64_t)0xff << 40)) |
692cbc052aSOlivier Houchard 	    ((_x << 40) & ((__uint64_t)0xff << 48)) | ((_x << 56)));
702cbc052aSOlivier Houchard }
712cbc052aSOlivier Houchard 
722cbc052aSOlivier Houchard static __inline __uint32_t
732cbc052aSOlivier Houchard __bswap32(__uint32_t v)
742cbc052aSOlivier Houchard {
752cbc052aSOlivier Houchard 	__uint32_t t1;
762cbc052aSOlivier Houchard 
772cbc052aSOlivier Houchard 	t1 = v ^ ((v << 16) | (v >> 16));
782cbc052aSOlivier Houchard 	t1 &= 0xff00ffffU;
792cbc052aSOlivier Houchard 	v = (v >> 8) | (v << 24);
802cbc052aSOlivier Houchard 	v ^= (t1 >> 8);
812cbc052aSOlivier Houchard 
822cbc052aSOlivier Houchard 	return (v);
832cbc052aSOlivier Houchard  }
842cbc052aSOlivier Houchard 
852cbc052aSOlivier Houchard static __inline __uint16_t
862cbc052aSOlivier Houchard __bswap16(__uint32_t v)
872cbc052aSOlivier Houchard {
882cbc052aSOlivier Houchard 	__asm __volatile(
892cbc052aSOlivier Houchard 	    "mov    %0, %1, ror #8\n"
902cbc052aSOlivier Houchard 	    "orr    %0, %0, %0, lsr #16\n"
912cbc052aSOlivier Houchard 	    "bic    %0, %0, %0, lsl #16"
922cbc052aSOlivier Houchard 	    : "=r" (v)
932cbc052aSOlivier Houchard 	    : "0" (v));
942cbc052aSOlivier Houchard 
952cbc052aSOlivier Houchard 	return (v);
962cbc052aSOlivier Houchard }
97d4cfb421SDavid E. O'Brien #endif /* !_ENDIAN_H_ */
98