[PATCH 1/6] make byte swapping macros less opaque to the optimizer
Jeremy Huddleston
jeremyhu at apple.com
Wed Apr 27 22:46:25 PDT 2011
For 1,2,4,5:
Reviewed-by: Jeremy Huddleston <jeremyhu at apple.com>
Tested-by: Jeremy Huddleston <jeremyhu at apple.com>
For 3,6:
Reviewed-by: Jeremy Huddleston <jeremyhu at apple.com>
On Apr 27, 2011, at 16:33, Matt Turner wrote:
> Text size reduction of ~33k (1.8%):
> text data bss dec hex filename
> 1879739 72212 55328 2007279 1ea0ef hw/xfree86/Xorg.before
> 1845291 72212 55328 1972831 1e1a5f hw/xfree86/Xorg
>
> On x86[-64], the number of bswap instructions goes up from 5 to 1006.
>
> By defining lswapl as gcc's builtin bswap32, the number of bswap
> instructions used goes up to 1025, but the text and binary sizes stay
> the same. This tells me that either gcc is
> - dumb, and unable to optimize away __builtin_bswap32 when it should
> - smart, and able to optimize away the open-coded bswap
>
> Either way, it doesn't matter much.
>
> Signed-off-by: Matt Turner <mattst88 at gmail.com>
> ---
>
> The follow-up patch to this which removes the temporary variables used
> by the swap macros is too big for the mailing list, so please review it
> here:
> http://cgit.freedesktop.org/~mattst88/xserver/commit/?id=11ff6813cf2f2a04243f4eecb60078d77fc973ec
>
> I have compile tested ephyr and dmx, but I wasn't able to compile test
> XQuartz, so please give it a test.
>
> include/misc.h | 31 ++++++++-----------------------
> 1 files changed, 8 insertions(+), 23 deletions(-)
>
> diff --git a/include/misc.h b/include/misc.h
> index 803f5ba..b7a3fd2 100644
> --- a/include/misc.h
> +++ b/include/misc.h
> @@ -240,32 +240,17 @@ xstrtokenize(const char *str, const char* separators);
> #define SwapRestL(stuff) \
> SwapLongs((CARD32 *)(stuff + 1), LengthRestL(stuff))
>
> -/* byte swap a 32-bit value */
> -#define swapl(x, n) { \
> - n = ((char *) (x))[0];\
> - ((char *) (x))[0] = ((char *) (x))[3];\
> - ((char *) (x))[3] = n;\
> - n = ((char *) (x))[1];\
> - ((char *) (x))[1] = ((char *) (x))[2];\
> - ((char *) (x))[2] = n; }
> -
> -/* byte swap a short */
> -#define swaps(x, n) { \
> - n = ((char *) (x))[0];\
> - ((char *) (x))[0] = ((char *) (x))[1];\
> - ((char *) (x))[1] = n; }
> -
> /* copy 32-bit value from src to dst byteswapping on the way */
> -#define cpswapl(src, dst) { \
> - ((char *)&(dst))[0] = ((char *) &(src))[3];\
> - ((char *)&(dst))[1] = ((char *) &(src))[2];\
> - ((char *)&(dst))[2] = ((char *) &(src))[1];\
> - ((char *)&(dst))[3] = ((char *) &(src))[0]; }
> +#define cpswapl(src, dst) (dst) = lswapl((src))
>
> /* copy short from src to dst byteswapping on the way */
> -#define cpswaps(src, dst) { \
> - ((char *) &(dst))[0] = ((char *) &(src))[1];\
> - ((char *) &(dst))[1] = ((char *) &(src))[0]; }
> +#define cpswaps(src, dst) (dst) = lswaps((src))
> +
> +/* byte swap a 32-bit value */
> +#define swapl(x, n) (*(x)) = lswapl(*(x))
> +
> +/* byte swap a short */
> +#define swaps(x, n) (*(x)) = lswaps(*(x))
>
> extern _X_EXPORT void SwapLongs(
> CARD32 *list,
> --
> 1.7.3.4
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list