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