* [PATCH] Re: bswap on prescott
[not found] <4354d3270701241326v596084d5m2341d6ce2cfa201f@mail.gmail.com>
@ 2007-01-24 21:51 ` Jakub Jelinek
2007-01-25 1:23 ` Roland McGrath
0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2007-01-24 21:51 UTC (permalink / raw)
To: Ulrich Drepper, edwintorok; +Cc: Glibc hackers
On Wed, Jan 24, 2007 at 11:26:44PM +0200, T?r?k Edvin wrote:
> If I compile a program using ntohl with '-march=prescott -O2', I get 3
> ror instr., however if I compile it with '-march=pentium4 -O2', I get
> the bswap instr.
>
> Looking at bits/byteswap.h, it seems that prescott is missing from the list:
>
> # if __WORDSIZE == 64 || (defined __i486__ || defined __pentium__
> \
> || defined __pentiumpro__ || defined __pentium4__
> \
> || defined __k8__ || defined __athlon__
> \
> || defined __k6__)
> [...]
> __asm__ ("bswap %0",...
>
> Is this intended behaviour? Which is faster on prescott: bswap, or the
> 3 rotations?
No, byteswap.h just didn't keep with the speed of new -march macro additions
in GCC. This adds what has been added recently:
2007-01-24 Jakub Jelinek <jakub@redhat.com>
* sysdeps/i386/bits/byteswap.h (__bswap_32): Add __nocona__, __core2__
and __geode__ to the list of i486+ CPUs.
* sysdeps/x86_64/bits/byteswap.h (__bswap_32): Likewise.
--- libc/sysdeps/i386/bits/byteswap.h.jj 2006-08-24 09:02:16.000000000 +0200
+++ libc/sysdeps/i386/bits/byteswap.h 2007-01-24 22:34:45.000000000 +0100
@@ -1,5 +1,6 @@
/* Macros to swap the order of bytes in integer values.
- Copyright (C) 1997,1998,2000,2002,2003,2006 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1998, 2000, 2002, 2003, 2006, 2007
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -66,7 +67,8 @@ __bswap_16 (unsigned short int __bsx)
`bswap' opcode. On i386 we have to use three instructions. */
# if !defined __i486__ && !defined __pentium__ && !defined __pentiumpro__ \
&& !defined __pentium4__ && !defined __k8__ && !defined __athlon__ \
- && !defined __k6__
+ && !defined __k6__ && !defined __nocona__ && !defined __core2__ \
+ && !defined __geode__
# define __bswap_32(x) \
(__extension__ \
({ register unsigned int __v, __x = (x); \
--- libc/sysdeps/x86_64/bits/byteswap.h.jj 2003-08-17 08:32:00.000000000 +0200
+++ libc/sysdeps/x86_64/bits/byteswap.h 2007-01-24 22:35:36.000000000 +0100
@@ -1,5 +1,6 @@
/* Macros to swap the order of bytes in integer values.
- Copyright (C) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1997, 1998, 2000, 2002, 2003, 2007
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -59,7 +60,8 @@
# if __WORDSIZE == 64 || (defined __i486__ || defined __pentium__ \
|| defined __pentiumpro__ || defined __pentium4__ \
|| defined __k8__ || defined __athlon__ \
- || defined __k6__)
+ || defined __k6__ || defined __nocona__ \
+ || defined __core2__ || defined __geode__)
/* To swap the bytes in a word the i486 processors and up provide the
`bswap' opcode. On i386 we have to use three instructions. */
# define __bswap_32(x) \
Jakub
^ permalink raw reply [flat|nested] 2+ messages in thread