Computed gotos on Reddit
Walter Bright
newshound2 at digitalmars.com
Tue Jul 24 14:40:24 PDT 2012
On 7/24/2012 12:50 PM, Dmitry Olshansky wrote:
>> are the same (same as in same number of indirections).
>>
>> switch (code[pc++])
>>
>> and
>>
>> goto code[pc++]()
>>
>> are the same, too.
>
> It's not. Let's get to assembly then. It's an illustration as I'm no expert and
> may have made some illegal shortcuts in this listing.
>
> goto code[pc++]() is roughly:
>
> mov ecx, [ebx]
> inc ebx
> jmp [ecx]
jmp code[ecx]
> switch(code[pc++]) is:
>
> mov ecx, [ebx]
> inc ebx
> mov ecx, [edx+ecx] // assuming jump table is at edx
> jump [ecx]
jmp jumptable[ecx]
> If you count only jumps, then yes, the same number of indirect jumps. BUT note
> the use of extra register to point to the table & extra read of jump table
> contents. (BTW I assumed jump table address is loaded in register, a luxurious
> assumption esp. on 32bit).
You don't need an extra register for the jump table address - and if you did,
you'd need it for both, as the table needs to be referenced somehow.
Addressing modes have long been "for free" in turns of runtime cost, so
[ECX]
and
offset[ECX]
are the same cost.
> Again, the biggest practical limitation of switches (loosing some performance
> hurts but not show stopper) is that last time I checked dmd doesn't try to merge
> equivalent jump tables.
I can't think of an example of this.
> Thus I can't put VM dispatch switch at the of each branch of main opcode switch
> (see my earlier posts) to help branch predictor. It just spawns ton of new
> tables, of course it has lower performance and wastes data cache.
Please post source code example so I understand what you mean.
More information about the Digitalmars-d
mailing list