/*
 * IDI,NTNU
 *
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://opensource.org/licenses/CDDL-1.0.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 * Copyright (C) 2009, 2010, Jorn Amundsen <jorn.amundsen@ntnu.no>
 *
 * C header file to determine compile machine byte order. Take care when cross
 * compiling.
 *
 * $Id: byteorder.h 517 2013-02-17 20:34:39Z joern $
 */
/*
 * Portions copyright (c) 2013, Saso Kiselkov, All rights reserved
 */

#ifndef _CRYPTO_EDONR_BYTEORDER_H
#define	_CRYPTO_EDONR_BYTEORDER_H

#include <sys/sysmacros.h>
#include <sys/param.h>

#if defined(__BYTE_ORDER)
#if (__BYTE_ORDER == __BIG_ENDIAN)
#define	MACHINE_IS_BIG_ENDIAN
#elif (__BYTE_ORDER == __LITTLE_ENDIAN)
#define	MACHINE_IS_LITTLE_ENDIAN
#endif
#elif defined(BYTE_ORDER)
#if (BYTE_ORDER == BIG_ENDIAN)
#define	MACHINE_IS_BIG_ENDIAN
#elif (BYTE_ORDER == LITTLE_ENDIAN)
#define	MACHINE_IS_LITTLE_ENDIAN
#endif
#endif /* __BYTE_ORDER || BYTE_ORDER */

#if !defined(MACHINE_IS_BIG_ENDIAN) && !defined(MACHINE_IS_LITTLE_ENDIAN)
#if defined(_ZFS_BIG_ENDIAN) || defined(_MIPSEB)
#define	MACHINE_IS_BIG_ENDIAN
#endif
#if defined(_ZFS_LITTLE_ENDIAN) || defined(_MIPSEL)
#define	MACHINE_IS_LITTLE_ENDIAN
#endif
#endif /* !MACHINE_IS_BIG_ENDIAN && !MACHINE_IS_LITTLE_ENDIAN */

#if !defined(MACHINE_IS_BIG_ENDIAN) && !defined(MACHINE_IS_LITTLE_ENDIAN)
#error unknown machine byte sex
#endif

#define	BYTEORDER_INCLUDED

#if defined(MACHINE_IS_BIG_ENDIAN)
/*
 * Byte swapping macros for big endian architectures and compilers,
 * add as appropriate for other architectures and/or compilers.
 *
 *     ld_swap64(src,dst) : uint64_t dst = *(src)
 *     st_swap64(src,dst) : *(dst)       = uint64_t src
 */

#if defined(__PPC__) || defined(_ARCH_PPC)

#if defined(__64BIT__)
#if defined(_ARCH_PWR7)
#define	aix_ld_swap64(s64, d64)\
	__asm__("ldbrx %0,0,%1" : "=r"(d64) : "r"(s64))
#define	aix_st_swap64(s64, d64)\
	__asm__ volatile("stdbrx %1,0,%0" : : "r"(d64), "r"(s64))
#else
#define	aix_ld_swap64(s64, d64)						\
{									\
	uint64_t *s4 = 0, h; /* initialize to zero for gcc warning */	\
									\
	__asm__("addi %0,%3,4;lwbrx %1,0,%3;lwbrx %2,0,%0;rldimi %1,%2,32,0"\
		: "+r"(s4), "=r"(d64), "=r"(h) : "b"(s64));		\
}

#define	aix_st_swap64(s64, d64)						\
{									\
	uint64_t *s4 = 0, h; /* initialize to zero for gcc warning */	\
	h = (s64) >> 32;						\
	__asm__ volatile("addi %0,%3,4;stwbrx %1,0,%3;stwbrx %2,0,%0"	\
		: "+r"(s4) : "r"(s64), "r"(h), "b"(d64));		\
}
#endif /* 64BIT && PWR7 */
#else
#define	aix_ld_swap64(s64, d64)						\
{									\
	uint32_t *s4 = 0, h, l;	/* initialize to zero for gcc warning */\
	__asm__("addi %0,%3,4;lwbrx %1,0,%3;lwbrx %2,0,%0"		\
		: "+r"(s4), "=r"(l), "=r"(h) : "b"(s64));		\
	d64 = ((uint64_t)h<<32) | l;					\
}

#define	aix_st_swap64(s64, d64)						\
{									\
	uint32_t *s4 = 0, h, l; /* initialize to zero for gcc warning */\
	l = (s64) & 0xfffffffful, h = (s64) >> 32;			\
	__asm__ volatile("addi %0,%3,4;stwbrx %1,0,%3;stwbrx %2,0,%0"	\
		: "+r"(s4) : "r"(l), "r"(h), "b"(d64));			\
}
#endif /* __64BIT__ */
#define	aix_ld_swap32(s32, d32)\
	__asm__("lwbrx %0,0,%1" : "=r"(d32) : "r"(s32))
#define	aix_st_swap32(s32, d32)\
	__asm__ volatile("stwbrx %1,0,%0" : : "r"(d32), "r"(s32))
#define	ld_swap32(s, d) aix_ld_swap32(s, d)
#define	st_swap32(s, d) aix_st_swap32(s, d)
#define	ld_swap64(s, d) aix_ld_swap64(s, d)
#define	st_swap64(s, d) aix_st_swap64(s, d)
#endif /* __PPC__ || _ARCH_PPC */

#if defined(__sparc)
#if !defined(__arch64__) && !defined(__sparcv8) && defined(__sparcv9)
#define	__arch64__
#endif
#if defined(__GNUC__) || (defined(__SUNPRO_C) && __SUNPRO_C > 0x590)
/* need Sun Studio C 5.10 and above for GNU inline assembly */
#if defined(__arch64__)
#define	sparc_ld_swap64(s64, d64)					\
	__asm__("ldxa [%1]0x88,%0" : "=r"(d64) : "r"(s64))
#define	sparc_st_swap64(s64, d64)					\
	__asm__ volatile("stxa %0,[%1]0x88" : : "r"(s64), "r"(d64))
#define	st_swap64(s, d) sparc_st_swap64(s, d)
#else
#define	sparc_ld_swap64(s64, d64)					\
{									\
	uint32_t *s4, h, l;						\
	__asm__("add %3,4,%0\n\tlda [%3]0x88,%1\n\tlda [%0]0x88,%2"	\
		: "+r"(s4), "=r"(l), "=r"(h) : "r"(s64));		\
	d64 = ((uint64_t)h<<32) | l;					\
}
#define	sparc_st_swap64(s64, d64)					\
{									\
	uint32_t *s4, h, l;						\
	l = (s64) & 0xfffffffful, h = (s64) >> 32;			\
	__asm__ volatile("add %3,4,%0\n\tsta %1,[%3]0x88\n\tsta %2,[%0]0x88"\
		: "+r"(s4) : "r"(l), "r"(h), "r"(d64));			\
}
#endif /* sparc64 */
#define	sparc_ld_swap32(s32, d32)\
	__asm__("lda [%1]0x88,%0" : "=r"(d32) : "r"(s32))
#define	sparc_st_swap32(s32, d32)\
	__asm__ volatile("sta %0,[%1]0x88" : : "r"(s32), "r"(d32))
#define	ld_swap32(s, d) sparc_ld_swap32(s, d)
#define	st_swap32(s, d) sparc_st_swap32(s, d)
#define	ld_swap64(s, d) sparc_ld_swap64(s, d)
#define	st_swap64(s, d) sparc_st_swap64(s, d)
#endif /* GCC || Sun Studio C > 5.9 */
#endif /* sparc */

/* GCC fallback */
#if ((__GNUC__ >= 4) || defined(__PGIC__)) && !defined(ld_swap32)
#define	ld_swap32(s, d) (d = __builtin_bswap32(*(s)))
#define	st_swap32(s, d) (*(d) = __builtin_bswap32(s))
#endif /* GCC4/PGIC && !swap32 */
#if ((__GNUC__ >= 4) || defined(__PGIC__)) && !defined(ld_swap64)
#define	ld_swap64(s, d) (d = __builtin_bswap64(*(s)))
#define	st_swap64(s, d) (*(d) = __builtin_bswap64(s))
#endif /* GCC4/PGIC && !swap64 */

/* generic fallback */
#if !defined(ld_swap32)
#define	ld_swap32(s, d)							\
	(d = (*(s) >> 24) | (*(s) >> 8 & 0xff00) |			\
	(*(s) << 8 & 0xff0000) | (*(s) << 24))
#define	st_swap32(s, d)							\
	(*(d) = ((s) >> 24) | ((s) >> 8 & 0xff00) |			\
	((s) << 8 & 0xff0000) | ((s) << 24))
#endif
#if !defined(ld_swap64)
#define	ld_swap64(s, d)							\
	(d = (*(s) >> 56) | (*(s) >> 40 & 0xff00) |			\
	(*(s) >> 24 & 0xff0000) | (*(s) >> 8 & 0xff000000) |		\
	(*(s) & 0xff000000) << 8 | (*(s) & 0xff0000) << 24 |		\
	(*(s) & 0xff00) << 40 | *(s) << 56)
#define	st_swap64(s, d)							\
	(*(d) = ((s) >> 56) | ((s) >> 40 & 0xff00) |			\
	((s) >> 24 & 0xff0000) | ((s) >> 8 & 0xff000000) |		\
	((s) & 0xff000000) << 8 | ((s) & 0xff0000) << 24 |		\
	((s) & 0xff00) << 40 | (s) << 56)
#endif

#endif /* MACHINE_IS_BIG_ENDIAN */


#if defined(MACHINE_IS_LITTLE_ENDIAN)
/* replace swaps with simple assignments on little endian systems */
#undef	ld_swap32
#undef	st_swap32
#define	ld_swap32(s, d) (d = *(s))
#define	st_swap32(s, d) (*(d) = s)
#undef	ld_swap64
#undef	st_swap64
#define	ld_swap64(s, d) (d = *(s))
#define	st_swap64(s, d) (*(d) = s)
#endif /* MACHINE_IS_LITTLE_ENDIAN */

#endif /* _CRYPTO_EDONR_BYTEORDER_H */
