131e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih/* libFLAC - Free Lossless Audio Codec library 231e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * Copyright (C) 2012-2014 Xiph.org Foundation 331e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * 431e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * Redistribution and use in source and binary forms, with or without 531e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * modification, are permitted provided that the following conditions 631e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * are met: 731e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * 831e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * - Redistributions of source code must retain the above copyright 931e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * notice, this list of conditions and the following disclaimer. 1031e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * 1131e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * - Redistributions in binary form must reproduce the above copyright 1231e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * notice, this list of conditions and the following disclaimer in the 1331e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * documentation and/or other materials provided with the distribution. 1431e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * 1531e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * - Neither the name of the Xiph.org Foundation nor the names of its 1631e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * contributors may be used to endorse or promote products derived from 1731e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * this software without specific prior written permission. 1831e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * 1931e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 2031e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2131e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2231e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR 2331e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 2431e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2531e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 2631e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 2731e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 2831e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 2931e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 3031e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih */ 3131e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 3231e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih/* It is assumed that this header will be included after "config.h". */ 3331e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 3431e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#if HAVE_BSWAP32 /* GCC and Clang */ 3531e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 3631e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih/* GCC prior to 4.8 didn't provide bswap16 on x86_64 */ 3731e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#if ! HAVE_BSWAP16 3831e4f3166a91a2ebb34f643787122a638d9f1471Robert Shihstatic inline unsigned short __builtin_bswap16(unsigned short a) 3931e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih{ 4031e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih return (a<<8)|(a>>8); 4131e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih} 4231e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#endif 4331e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 4431e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#define ENDSWAP_16(x) (__builtin_bswap16 (x)) 4531e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#define ENDSWAP_32(x) (__builtin_bswap32 (x)) 4631e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 4731e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#elif defined _MSC_VER /* Windows. Apparently in <stdlib.h>. */ 4831e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 4931e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#define ENDSWAP_16(x) (_byteswap_ushort (x)) 5031e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#define ENDSWAP_32(x) (_byteswap_ulong (x)) 5131e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 5231e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#elif defined HAVE_BYTESWAP_H /* Linux */ 5331e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 5431e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#include <byteswap.h> 5531e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 5631e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#define ENDSWAP_16(x) (bswap_16 (x)) 5731e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#define ENDSWAP_32(x) (bswap_32 (x)) 5831e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 5931e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#else 6031e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 6131e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#define ENDSWAP_16(x) ((((x) >> 8) & 0xFF) | (((x) & 0xFF) << 8)) 6231e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#define ENDSWAP_32(x) ((((x) >> 24) & 0xFF) | (((x) >> 8) & 0xFF00) | (((x) & 0xFF00) << 8) | (((x) & 0xFF) << 24)) 6331e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 6431e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#endif 6531e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 6631e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 6731e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih/* Host to little-endian byte swapping. */ 6831e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#if CPU_IS_BIG_ENDIAN 6931e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 7031e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#define H2LE_16(x) ENDSWAP_16 (x) 7131e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#define H2LE_32(x) ENDSWAP_32 (x) 7231e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 7331e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#else 7431e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 7531e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#define H2LE_16(x) (x) 7631e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#define H2LE_32(x) (x) 7731e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih 7831e4f3166a91a2ebb34f643787122a638d9f1471Robert Shih#endif 79