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