Author: Robert Hyatt
Date: 20:23:30 02/10/00
Go up one level in this thread
On February 10, 2000 at 18:38:51, Eugene Nalimov wrote:
>And here is result of using MSVC:
>
>#include <stdlib.h>
>
>int type (int i)
>{
> return abs (i);
>}
>
>Assembly code is:
>
> mov eax, DWORD PTR [esp-4]
> cdq
> xor eax, edx
> sub eax, edx
> ret
>
>It also lacks the branch, but it is also shorter than GCC output, and will run
>on any 32-bit x86 processor.
>
>It is based in the following observation: abs (x) == (x ^ (x >> (sizeof (x) -
>1))) - (x >> (sizeof (x) - 1)).
>
>That is an example when good compiler can get rid of branch remaining compatible
>with old processors.
>
>Eugene
Right. I was making the point that the "?" operator doesn't need to
produce a branch at all. I only picked 'abs()' as an example... It
used to be 'evil'. Now it is perfectly ok to use ? if the compiler
knows about cmov.
>
>On February 10, 2000 at 18:01:14, Robert Hyatt wrote:
>
>>On February 10, 2000 at 17:50:54, Robert Hyatt wrote:
>>
>>Thought a sample bit of code would be even better for the TYPE issue
>>in Tom's question. Here is a simple piece of C code to compute the
>>absolute value of an integer and return it:
>>
>>abs(int i) {
>> int j;
>> j=(i > 0) ? i : -i;
>> return(j);
>>}
>>
>>Here is what gcc produces to accomplish that:
>>
>>abs:
>> pushl %ebp
>> movl %esp,%ebp
>> movl 8(%ebp),%eax
>> movl %eax,%edx
>> negl %edx
>> cmpl $-1,%eax
>> cmovle %edx,%eax
>> movl %ebp,%esp
>> popl %ebp
>> ret
>>
>>Which nicely avoids any branch penalties (except for the ret, but
>>this doesn't have to be a function of course, it could be inlined
>>easily.)
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.