Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Branchless code

Author: Robert Hyatt

Date: 13:41:11 11/19/02

Go up one level in this thread


On November 19, 2002 at 16:29:41, Eugene Nalimov wrote:

>You don't need asm file to figure out what is going on. For a large switch table
>compiler generated jump table, and code should look like
>    cmp eax, upper_switch_value+1
>    jnc default_case
>    mov eax, jump_table[eax*4]
>    jmp eax
>Here indirect branch is not better than indirect function call. Plus, as Gunnar
>mentioned, there is some overhead.


What about a jump to a jump instead?  That ought to be more predictable as the
second jump will _always_ be taken and to the same target address.  IE the first
"switch" I saw did something like this:

assuming ebx has the switch case (0,1,..., N-1)
<check range>
lea  eax, jumptable+ebx*4
jmp [eax]

And jumptable looked like this:

jumptable:  jmp   case0
                   jmp   case1

etc...

That is loosely translated into x86 assembly as this was not an x86
architecture,
and yes, the ebx*4 is not quite the right number, but it was the idea rather
than
trying to adjust ebx by a non-power-of-2 and I chose the easy way for
illustration...

the jmp [eax] can't be predicted, but the rest in the jump table can be.



>
>Thanks,
>Eugene
>
>On November 19, 2002 at 14:40:50, Robert Hyatt wrote:
>
>>On November 19, 2002 at 04:41:59, Gunnar Andersson wrote:
>>
>>>On November 18, 2002 at 20:09:27, Eugene Nalimov wrote:
>>>
>>>>Indirect call costs *at least* the same as conditional branch, sometimes much
>>>>more.
>>>
>>>I've discovered that arrays of function pointers can outperform switch
>>>statements, at least with GCC and many cases.  To me the generated assembly code
>>>for the switch statement contains a jump table anyway, and there's some extra
>>>assembly code essentially performing range checking.
>>>
>>>/ Gunnar
>>
>>
>>It would be interesting to look at the .s file from gcc to see what it is doing.
>> The
>>indirect calls should be bad.  Of course the range checking in a switch is also
>>bad,
>>but I have seen compilers that would let me turn this off...



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.