13123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh/*	$OpenBSD: endian.h,v 1.3 2005/12/13 00:35:23 millert Exp $	*/
23123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
33123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh/*
43123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Copyright (C) 2010 The Android Open Source Project
53123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * All rights reserved.
63123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *
73123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * Redistribution and use in source and binary forms, with or without
83123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * modification, are permitted provided that the following conditions
93123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * are met:
103123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *  * Redistributions of source code must retain the above copyright
113123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *    notice, this list of conditions and the following disclaimer.
123123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *  * Redistributions in binary form must reproduce the above copyright
133123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *    notice, this list of conditions and the following disclaimer in
143123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *    the documentation and/or other materials provided with the
153123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *    distribution.
163123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *
173123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
183123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
193123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
203123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
213123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
223123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
233123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
243123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
253123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
263123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
273123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
283123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * SUCH DAMAGE.
293123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */
303123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
313123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#ifndef _ARM_ENDIAN_H_
323123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#define _ARM_ENDIAN_H_
333123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
343123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#ifdef __GNUC__
353123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
363123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh/*
373123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * REV and REV16 weren't available on ARM5 or ARM4.
383123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * We don't include <machine/cpu-features.h> because it pollutes the
393123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * namespace with macros like PLD.
403123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */
413123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#if !defined __ARM_ARCH_5__ && !defined __ARM_ARCH_5T__ && \
423123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    !defined __ARM_ARCH_5TE__ && !defined __ARM_ARCH_5TEJ__ && \
433123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    !defined __ARM_ARCH_4T__ && !defined __ARM_ARCH_4__
443123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
453123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh/* According to RealView Assembler User's Guide, REV and REV16 are available
463123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * in Thumb code and 16-bit instructions when used in Thumb-2 code.
473123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *
483123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * REV Rd, Rm
493123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *   Rd and Rm must both be Lo registers.
503123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *
513123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * REV16 Rd, Rm
523123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *   Rd and Rm must both be Lo registers.
533123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh *
543123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh * The +l constraint takes care of this without constraining us in ARM mode.
553123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh */
563123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#define __swap16md(x) ({                                        \
573123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    register u_int16_t _x = (x);                                \
583123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    __asm volatile ("rev16 %0, %0" : "+l" (_x));                \
593123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    _x;                                                         \
603123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh})
613123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
623123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#define __swap32md(x) ({                                        \
633123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    register u_int32_t _x = (x);                                \
643123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    __asm volatile ("rev %0, %0" : "+l" (_x));                  \
653123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    _x;                                                         \
663123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh})
673123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
683123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#define __swap64md(x) ({                                        \
693123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    u_int64_t _swap64md_x = (x);                                \
703123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh    (u_int64_t) __swap32md(_swap64md_x >> 32) |                 \
713123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh        (u_int64_t) __swap32md(_swap64md_x & 0xffffffff) << 32; \
723123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh})
733123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
743123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh/* Tell sys/endian.h we have MD variants of the swap macros.  */
753123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#define MD_SWAP
763123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
773123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif  /* __ARM_ARCH__ */
783123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif  /* __GNUC__ */
793123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
803123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#if defined(__ARMEB__)
813123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#define _BYTE_ORDER _BIG_ENDIAN
823123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#else
833123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#define _BYTE_ORDER _LITTLE_ENDIAN
843123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif
853123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#define __STRICT_ALIGNMENT
863123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#include <sys/types.h>
873123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#include <sys/endian.h>
883123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh
893123853ede6209e485fb7110bdcd38aea0f33d23Andrew Hsieh#endif  /* !_ARM_ENDIAN_H_ */
90