xref: /openbsd/sys/arch/sh/include/endian.h (revision 09467b48)
1 /*	$OpenBSD: endian.h,v 1.8 2019/02/17 15:44:26 deraadt Exp $	*/
2 /*	$NetBSD: endian.h,v 1.4 2000/03/17 00:09:25 mycroft Exp $	*/
3 
4 /* Written by Manuel Bouyer. Public domain */
5 
6 #ifndef _SH_ENDIAN_H_
7 #define	_SH_ENDIAN_H_
8 
9 #ifndef __FROM_SYS__ENDIAN
10 #include <sys/_types.h>
11 #endif
12 
13 static __inline __uint16_t
14 __swap16md(__uint16_t _x)
15 {
16 	__uint16_t _rv;
17 
18 	__asm volatile ("swap.b %1,%0" : "=r"(_rv) : "r"(_x));
19 
20 	 return (_rv);
21 }
22 
23 static __inline __uint32_t
24 __swap32md(__uint32_t _x)
25 {
26 	__uint32_t _rv;
27 
28 	__asm volatile ("swap.b %1,%0; swap.w %0,%0; swap.b %0,%0"
29 			  : "=r"(_rv) : "r"(_x));
30 
31 	return (_rv);
32 }
33 
34 static __inline __uint64_t
35 __swap64md(__uint64_t _x)
36 {
37 	__uint64_t _rv;
38 
39 	_rv = (__uint64_t)__swap32md((__uint32_t)(_x >> 32)) |
40 	    (__uint64_t)__swap32md((__uint32_t)_x) << 32;
41 
42 	return (_rv);
43 }
44 
45 /* Tell sys/endian.h we have MD variants of the swap macros.  */
46 #define __HAVE_MD_SWAP
47 
48 #ifdef __LITTLE_ENDIAN__
49 #define	_BYTE_ORDER _LITTLE_ENDIAN
50 #else
51 #define	_BYTE_ORDER _BIG_ENDIAN
52 #endif
53 #define	__STRICT_ALIGNMENT
54 
55 #ifndef __FROM_SYS__ENDIAN
56 #include <sys/endian.h>
57 #endif
58 
59 #endif /* !_SH_ENDIAN_H_ */
60