Author: Graham Laight
Date: 13:08:05 01/03/03
Go up one level in this thread
On January 03, 2003 at 13:37:25, Robert Hyatt wrote:
>On January 03, 2003 at 10:00:51, Graham Laight wrote:
>
>
>Here is a snippet of assembly produced by gcc, for the test
>
>if (x[1]==3 || x[1]==7) return(1);
>else return(0);
>
> movl x+4, %eax
> cmpl $3, %eax
> sete %dl
> cmpl $7, %eax
> sete %al
> orl %edx, %eax
> testl $1, %eax
> sete %al
> movzbl %al, %eax
> ret
>
>Note that X+4 (x[1]) is copied to eax and compared against twice. This is
>_exactly_ what happens when you do it the other was by putting x[1] into a
>temp first...
>
>no difference whatsoever...
>
>Notice that the compiler also avoids two jumps by saving the results of the two
>comparisons (sete instructions) and then or'ing the two results together and
>then
>using that to compute the proper return value without a jump at all.
>
>Compilers are pretty good...
That's 10 assembly commands for 10 C instructions (see count below).
On a 1 Ghz machine that was doing nothing else, that's a theoretical 100 million
loops per second.
I admit - I'm impressed!
-g
Count
=====
if (x[1]==3 || x[1]==7) return(1);
1 2 3 4 5 6 7 8 9
else return(0);
10
1 movl x+4, %eax
2 cmpl $3, %eax
3 sete %dl
4 cmpl $7, %eax
5 sete %al
6 orl %edx, %eax
7 testl $1, %eax
8 sete %al
9 movzbl %al, %eax
10 ret
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.