* Improved Swapping Method In sort.c
@ 2008-04-30 17:09 Soumyadip Das Mahapatra
2008-04-30 17:30 ` Jan Engelhardt
` (3 more replies)
0 siblings, 4 replies; 6+ messages in thread
From: Soumyadip Das Mahapatra @ 2008-04-30 17:09 UTC (permalink / raw)
To: linux-kernel
Hello everybody,
The swapping method (in function void u32_swap() line no.. 14 to 16) in lib/sort.c can be improved by using the following code
*(u32 *)b ^= *(u32 *)a ^= *(u32 *)b ^= *(u32 *)a instead of the code given. This code
is not using third variable thus not consuming another memory. And I dont see any significance in
using *int size* argument. so the function should be
static void u32_swap(void *a, void *b)
{
*(u32 *)b ^= *(u32 *)a ^= *(u32 *)b ^= *(u32 *)a;
}
Meet people who discuss and share your passions. Go to http://in.promos.yahoo.com/groups/bestofyahoo/
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Improved Swapping Method In sort.c
2008-04-30 17:09 Improved Swapping Method In sort.c Soumyadip Das Mahapatra
@ 2008-04-30 17:30 ` Jan Engelhardt
2008-04-30 17:33 ` Jan Engelhardt
` (2 subsequent siblings)
3 siblings, 0 replies; 6+ messages in thread
From: Jan Engelhardt @ 2008-04-30 17:30 UTC (permalink / raw)
To: Soumyadip Das Mahapatra; +Cc: linux-kernel
On Wednesday 2008-04-30 19:09, Soumyadip Das Mahapatra wrote:
>Hello everybody, The swapping method (in function void u32_swap() line no.. 14
>to 16) in lib/sort.c can be improved by using the following code *(u32 *)b ^=
>*(u32 *)a ^= *(u32 *)b ^= *(u32 *)a instead of the code given.
GCC is smart enough to optimize the current instructions into a
bswap instruction or similar. While with xor, some are said to fail -
and three xor operations are surely slower than a swap if there is
a swap instruction.
Never heard of that?
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Improved Swapping Method In sort.c
2008-04-30 17:09 Improved Swapping Method In sort.c Soumyadip Das Mahapatra
2008-04-30 17:30 ` Jan Engelhardt
@ 2008-04-30 17:33 ` Jan Engelhardt
2008-04-30 18:03 ` Sami Farin
2008-04-30 18:46 ` David Newall
2008-05-02 5:05 ` H. Peter Anvin
3 siblings, 1 reply; 6+ messages in thread
From: Jan Engelhardt @ 2008-04-30 17:33 UTC (permalink / raw)
To: Soumyadip Das Mahapatra; +Cc: linux-kernel
On Wednesday 2008-04-30 19:09, Soumyadip Das Mahapatra wrote:
>Hello everybody,
>The swapping method (in function void u32_swap() line no.. 14 to 16) in lib/sort.c can be improved by using the following code
>*(u32 *)b ^= *(u32 *)a ^= *(u32 *)b ^= *(u32 *)a instead of the code given. This code
>is not using third variable thus not consuming another memory. And I dont see any significance in
>using *int size* argument. so the function should be
>static void u32_swap(void *a, void *b)
>{
> *(u32 *)b ^= *(u32 *)a ^= *(u32 *)b ^= *(u32 *)a;
>}
That proposal looks like buggy.
19:32 yaguchi:/dev/shm > cat ui.c
#include <stdint.h>
#include <stdio.h>
static void u32_swap(void *a, void *b)
{
*(uint32_t *)b ^= *(uint32_t *)a
^= *(uint32_t *)b
^= *(uint32_t *)a;
}
int main(void)
{
uint32_t x = 5, y = 7;
printf("%u %u\n", x, y);
u32_swap(&x, &y);
printf("%u %u\n", x, y);
}
19:32 yaguchi:/dev/shm > ./a.out
5 7
7 0
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Improved Swapping Method In sort.c
2008-04-30 17:33 ` Jan Engelhardt
@ 2008-04-30 18:03 ` Sami Farin
0 siblings, 0 replies; 6+ messages in thread
From: Sami Farin @ 2008-04-30 18:03 UTC (permalink / raw)
To: linux-kernel
On Wed, Apr 30, 2008 at 19:33:42 +0200, Jan Engelhardt wrote:
>
> On Wednesday 2008-04-30 19:09, Soumyadip Das Mahapatra wrote:
>
> >Hello everybody,
> >The swapping method (in function void u32_swap() line no.. 14 to 16) in lib/sort.c can be improved by using the following code
> >*(u32 *)b ^= *(u32 *)a ^= *(u32 *)b ^= *(u32 *)a instead of the code given. This code
> >is not using third variable thus not consuming another memory. And I dont see any significance in
> >using *int size* argument. so the function should be
> >static void u32_swap(void *a, void *b)
> >{
> > *(u32 *)b ^= *(u32 *)a ^= *(u32 *)b ^= *(u32 *)a;
> >}
>
> That proposal looks like buggy.
>
> 19:32 yaguchi:/dev/shm > cat ui.c
> #include <stdint.h>
> #include <stdio.h>
>
> static void u32_swap(void *a, void *b)
> {
> *(uint32_t *)b ^= *(uint32_t *)a
> ^= *(uint32_t *)b
> ^= *(uint32_t *)a;
> }
>
> int main(void)
> {
> uint32_t x = 5, y = 7;
> printf("%u %u\n", x, y);
> u32_swap(&x, &y);
> printf("%u %u\n", x, y);
> }
> 19:32 yaguchi:/dev/shm > ./a.out
> 5 7
> 7 0
This happens because u32_swap has undefined behavior.
Try this instead:
static void u32_swap(void *a, void *b)
{
*(uint32_t *)a ^= *(uint32_t *)b;
*(uint32_t *)b ^= *(uint32_t *)a;
*(uint32_t *)a ^= *(uint32_t *)b;
}
But still, this change to Linux is not necessary,
it actually generates worse code.
--
Do what you love because life is too short for anything else.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Improved Swapping Method In sort.c
2008-04-30 17:09 Improved Swapping Method In sort.c Soumyadip Das Mahapatra
2008-04-30 17:30 ` Jan Engelhardt
2008-04-30 17:33 ` Jan Engelhardt
@ 2008-04-30 18:46 ` David Newall
2008-05-02 5:05 ` H. Peter Anvin
3 siblings, 0 replies; 6+ messages in thread
From: David Newall @ 2008-04-30 18:46 UTC (permalink / raw)
To: Soumyadip Das Mahapatra; +Cc: linux-kernel
Soumyadip Das Mahapatra wrote:
> static void u32_swap(void *a, void *b)
> {
> *(u32 *)b ^= *(u32 *)a ^= *(u32 *)b ^= *(u32 *)a;
> }
>
That was posted to comp.lang.c 20 years ago or more. It's not something
that the compiler is likely to be able to optimize (unlike the normal
swap, using a temporary variable.)
Another cute, temp-free swap, from the same era, is: b += a -= b; a = b - a.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Improved Swapping Method In sort.c
2008-04-30 17:09 Improved Swapping Method In sort.c Soumyadip Das Mahapatra
` (2 preceding siblings ...)
2008-04-30 18:46 ` David Newall
@ 2008-05-02 5:05 ` H. Peter Anvin
3 siblings, 0 replies; 6+ messages in thread
From: H. Peter Anvin @ 2008-05-02 5:05 UTC (permalink / raw)
To: Soumyadip Das Mahapatra; +Cc: linux-kernel
Soumyadip Das Mahapatra wrote:
> Hello everybody,
> The swapping method (in function void u32_swap() line no.. 14 to 16) in lib/sort.c can be improved by using the following code
> *(u32 *)b ^= *(u32 *)a ^= *(u32 *)b ^= *(u32 *)a instead of the code given. This code
> is not using third variable thus not consuming another memory. And I dont see any significance in
> using *int size* argument. so the function should be
> static void u32_swap(void *a, void *b)
> {
> *(u32 *)b ^= *(u32 *)a ^= *(u32 *)b ^= *(u32 *)a;
> }
>
Not only is this invalid C, but it produces massively worse code.
-hpa
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2008-05-02 5:08 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-30 17:09 Improved Swapping Method In sort.c Soumyadip Das Mahapatra
2008-04-30 17:30 ` Jan Engelhardt
2008-04-30 17:33 ` Jan Engelhardt
2008-04-30 18:03 ` Sami Farin
2008-04-30 18:46 ` David Newall
2008-05-02 5:05 ` H. Peter Anvin
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox