xref: /openbsd-src/sys/arch/sh/include/endian.h (revision e9a8150065b24ecdeb158fae3d19fa220ea67402)
1*e9a81500Sderaadt /*	$OpenBSD: endian.h,v 1.8 2019/02/17 15:44:26 deraadt Exp $	*/
295c7671fSmiod /*	$NetBSD: endian.h,v 1.4 2000/03/17 00:09:25 mycroft Exp $	*/
395c7671fSmiod 
495c7671fSmiod /* Written by Manuel Bouyer. Public domain */
595c7671fSmiod 
62fa72412Spirofti #ifndef _SH_ENDIAN_H_
72fa72412Spirofti #define	_SH_ENDIAN_H_
895c7671fSmiod 
930189709Snaddy #ifndef __FROM_SYS__ENDIAN
1030189709Snaddy #include <sys/_types.h>
1130189709Snaddy #endif
1230189709Snaddy 
1330189709Snaddy static __inline __uint16_t
__swap16md(__uint16_t _x)1430189709Snaddy __swap16md(__uint16_t _x)
1530189709Snaddy {
1630189709Snaddy 	__uint16_t _rv;
1730189709Snaddy 
1830189709Snaddy 	__asm volatile ("swap.b %1,%0" : "=r"(_rv) : "r"(_x));
1930189709Snaddy 
2030189709Snaddy 	 return (_rv);
2130189709Snaddy }
2230189709Snaddy 
2330189709Snaddy static __inline __uint32_t
__swap32md(__uint32_t _x)2430189709Snaddy __swap32md(__uint32_t _x)
2530189709Snaddy {
2630189709Snaddy 	__uint32_t _rv;
2730189709Snaddy 
2830189709Snaddy 	__asm volatile ("swap.b %1,%0; swap.w %0,%0; swap.b %0,%0"
2930189709Snaddy 			  : "=r"(_rv) : "r"(_x));
3030189709Snaddy 
3130189709Snaddy 	return (_rv);
3230189709Snaddy }
3395c7671fSmiod 
348cba618eSnaddy static __inline __uint64_t
__swap64md(__uint64_t _x)358cba618eSnaddy __swap64md(__uint64_t _x)
368cba618eSnaddy {
378cba618eSnaddy 	__uint64_t _rv;
388cba618eSnaddy 
39*e9a81500Sderaadt 	_rv = (__uint64_t)__swap32md((__uint32_t)(_x >> 32)) |
40*e9a81500Sderaadt 	    (__uint64_t)__swap32md((__uint32_t)_x) << 32;
418cba618eSnaddy 
428cba618eSnaddy 	return (_rv);
438cba618eSnaddy }
4495c7671fSmiod 
4530189709Snaddy /* Tell sys/endian.h we have MD variants of the swap macros.  */
467c5b55ffSguenther #define __HAVE_MD_SWAP
4795c7671fSmiod 
4895c7671fSmiod #ifdef __LITTLE_ENDIAN__
4995c7671fSmiod #define	_BYTE_ORDER _LITTLE_ENDIAN
5095c7671fSmiod #else
5195c7671fSmiod #define	_BYTE_ORDER _BIG_ENDIAN
5295c7671fSmiod #endif
5395c7671fSmiod #define	__STRICT_ALIGNMENT
5495c7671fSmiod 
557c5b55ffSguenther #ifndef __FROM_SYS__ENDIAN
567c5b55ffSguenther #include <sys/endian.h>
577c5b55ffSguenther #endif
587c5b55ffSguenther 
592fa72412Spirofti #endif /* !_SH_ENDIAN_H_ */
60