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