1*4882a593Smuzhiyun /****************************************************************************** 2*4882a593Smuzhiyun * 3*4882a593Smuzhiyun * Copyright(c) 2007 - 2019 Realtek Corporation. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or modify it 6*4882a593Smuzhiyun * under the terms of version 2 of the GNU General Public License as 7*4882a593Smuzhiyun * published by the Free Software Foundation. 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, but WITHOUT 10*4882a593Smuzhiyun * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12*4882a593Smuzhiyun * more details. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun *****************************************************************************/ 15*4882a593Smuzhiyun #ifndef _LINUX_BYTEORDER_SWABB_H 16*4882a593Smuzhiyun #define _LINUX_BYTEORDER_SWABB_H 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun /* 19*4882a593Smuzhiyun * linux/byteorder/swabb.h 20*4882a593Smuzhiyun * SWAp Bytes Bizarrely 21*4882a593Smuzhiyun * swaHHXX[ps]?(foo) 22*4882a593Smuzhiyun * 23*4882a593Smuzhiyun * Support for obNUXIous pdp-endian and other bizarre architectures. 24*4882a593Smuzhiyun * Will Linux ever run on such ancient beasts? if not, this file 25*4882a593Smuzhiyun * will be but a programming pearl. Still, it's a reminder that we 26*4882a593Smuzhiyun * shouldn't be making too many assumptions when trying to be portable. 27*4882a593Smuzhiyun * 28*4882a593Smuzhiyun */ 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* 31*4882a593Smuzhiyun * Meaning of the names I chose (vaxlinux people feel free to correct them): 32*4882a593Smuzhiyun * swahw32 swap 16-bit half-words in a 32-bit word 33*4882a593Smuzhiyun * swahb32 swap 8-bit halves of each 16-bit half-word in a 32-bit word 34*4882a593Smuzhiyun * 35*4882a593Smuzhiyun * No 64-bit support yet. I don't know NUXI conventions for long longs. 36*4882a593Smuzhiyun * I guarantee it will be a mess when it's there, though :-> 37*4882a593Smuzhiyun * It will be even worse if there are conflicting 64-bit conventions. 38*4882a593Smuzhiyun * Hopefully, no one ever used 64-bit objects on NUXI machines. 39*4882a593Smuzhiyun * 40*4882a593Smuzhiyun */ 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun #define ___swahw32(x) \ 43*4882a593Smuzhiyun ({ \ 44*4882a593Smuzhiyun __u32 __x = (x); \ 45*4882a593Smuzhiyun ((__u32)(\ 46*4882a593Smuzhiyun (((__u32)(__x) & (__u32)0x0000ffffUL) << 16) | \ 47*4882a593Smuzhiyun (((__u32)(__x) & (__u32)0xffff0000UL) >> 16))); \ 48*4882a593Smuzhiyun }) 49*4882a593Smuzhiyun #define ___swahb32(x) \ 50*4882a593Smuzhiyun ({ \ 51*4882a593Smuzhiyun __u32 __x = (x); \ 52*4882a593Smuzhiyun ((__u32)(\ 53*4882a593Smuzhiyun (((__u32)(__x) & (__u32)0x00ff00ffUL) << 8) | \ 54*4882a593Smuzhiyun (((__u32)(__x) & (__u32)0xff00ff00UL) >> 8))); \ 55*4882a593Smuzhiyun }) 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun #define ___constant_swahw32(x) \ 58*4882a593Smuzhiyun ((__u32)(\ 59*4882a593Smuzhiyun (((__u32)(x) & (__u32)0x0000ffffUL) << 16) | \ 60*4882a593Smuzhiyun (((__u32)(x) & (__u32)0xffff0000UL) >> 16))) 61*4882a593Smuzhiyun #define ___constant_swahb32(x) \ 62*4882a593Smuzhiyun ((__u32)(\ 63*4882a593Smuzhiyun (((__u32)(x) & (__u32)0x00ff00ffUL) << 8) | \ 64*4882a593Smuzhiyun (((__u32)(x) & (__u32)0xff00ff00UL) >> 8))) 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* 67*4882a593Smuzhiyun * provide defaults when no architecture-specific optimization is detected 68*4882a593Smuzhiyun */ 69*4882a593Smuzhiyun #ifndef __arch__swahw32 70*4882a593Smuzhiyun #define __arch__swahw32(x) ___swahw32(x) 71*4882a593Smuzhiyun #endif 72*4882a593Smuzhiyun #ifndef __arch__swahb32 73*4882a593Smuzhiyun #define __arch__swahb32(x) ___swahb32(x) 74*4882a593Smuzhiyun #endif 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun #ifndef __arch__swahw32p 77*4882a593Smuzhiyun #define __arch__swahw32p(x) __swahw32(*(x)) 78*4882a593Smuzhiyun #endif 79*4882a593Smuzhiyun #ifndef __arch__swahb32p 80*4882a593Smuzhiyun #define __arch__swahb32p(x) __swahb32(*(x)) 81*4882a593Smuzhiyun #endif 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #ifndef __arch__swahw32s 84*4882a593Smuzhiyun #define __arch__swahw32s(x) do { *(x) = __swahw32p((x)); } while (0) 85*4882a593Smuzhiyun #endif 86*4882a593Smuzhiyun #ifndef __arch__swahb32s 87*4882a593Smuzhiyun #define __arch__swahb32s(x) do { *(x) = __swahb32p((x)); } while (0) 88*4882a593Smuzhiyun #endif 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /* 92*4882a593Smuzhiyun * Allow constant folding 93*4882a593Smuzhiyun */ 94*4882a593Smuzhiyun #if defined(__GNUC__) && (__GNUC__ >= 2) && defined(__OPTIMIZE__) 95*4882a593Smuzhiyun # define __swahw32(x) \ 96*4882a593Smuzhiyun (__builtin_constant_p((__u32)(x)) ? \ 97*4882a593Smuzhiyun ___swahw32((x)) : \ 98*4882a593Smuzhiyun __fswahw32((x))) 99*4882a593Smuzhiyun # define __swahb32(x) \ 100*4882a593Smuzhiyun (__builtin_constant_p((__u32)(x)) ? \ 101*4882a593Smuzhiyun ___swahb32((x)) : \ 102*4882a593Smuzhiyun __fswahb32((x))) 103*4882a593Smuzhiyun #else 104*4882a593Smuzhiyun # define __swahw32(x) __fswahw32(x) 105*4882a593Smuzhiyun # define __swahb32(x) __fswahb32(x) 106*4882a593Smuzhiyun #endif /* OPTIMIZE */ 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun __fswahw32(__u32 x)109*4882a593Smuzhiyun__inline static__ __const__ __u32 __fswahw32(__u32 x) 110*4882a593Smuzhiyun { 111*4882a593Smuzhiyun return __arch__swahw32(x); 112*4882a593Smuzhiyun } __swahw32p(__u32 * x)113*4882a593Smuzhiyun__inline static__ __u32 __swahw32p(__u32 *x) 114*4882a593Smuzhiyun { 115*4882a593Smuzhiyun return __arch__swahw32p(x); 116*4882a593Smuzhiyun } __swahw32s(__u32 * addr)117*4882a593Smuzhiyun__inline static__ void __swahw32s(__u32 *addr) 118*4882a593Smuzhiyun { 119*4882a593Smuzhiyun __arch__swahw32s(addr); 120*4882a593Smuzhiyun } 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun __fswahb32(__u32 x)123*4882a593Smuzhiyun__inline static__ __const__ __u32 __fswahb32(__u32 x) 124*4882a593Smuzhiyun { 125*4882a593Smuzhiyun return __arch__swahb32(x); 126*4882a593Smuzhiyun } __swahb32p(__u32 * x)127*4882a593Smuzhiyun__inline static__ __u32 __swahb32p(__u32 *x) 128*4882a593Smuzhiyun { 129*4882a593Smuzhiyun return __arch__swahb32p(x); 130*4882a593Smuzhiyun } __swahb32s(__u32 * addr)131*4882a593Smuzhiyun__inline static__ void __swahb32s(__u32 *addr) 132*4882a593Smuzhiyun { 133*4882a593Smuzhiyun __arch__swahb32s(addr); 134*4882a593Smuzhiyun } 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun #ifdef __BYTEORDER_HAS_U64__ 137*4882a593Smuzhiyun /* 138*4882a593Smuzhiyun * Not supported yet 139*4882a593Smuzhiyun */ 140*4882a593Smuzhiyun #endif /* __BYTEORDER_HAS_U64__ */ 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun #if defined(PLATFORM_LINUX) 143*4882a593Smuzhiyun #define swahw32 __swahw32 144*4882a593Smuzhiyun #define swahb32 __swahb32 145*4882a593Smuzhiyun #define swahw32p __swahw32p 146*4882a593Smuzhiyun #define swahb32p __swahb32p 147*4882a593Smuzhiyun #define swahw32s __swahw32s 148*4882a593Smuzhiyun #define swahb32s __swahb32s 149*4882a593Smuzhiyun #endif 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun #endif /* _LINUX_BYTEORDER_SWABB_H */ 152