goto [variable], and address of code labels
Dmitry Olshansky
dmitry.olsh at gmail.com
Fri Oct 28 12:30:12 PDT 2011
On 28.10.2011 22:57, ponce wrote:
> Provided some hairy conditions, the switch instruction will optimize to
> a jump table in GCC and probably most C compilers.
>
They do, you have no guaranties. It will either fly or crawl, depending
on sparseness of values. Even so it *usually* makes table, just check on
it from time to time ;).
> In ICC, some static analysis is even used to optimize out the test
> before the switch.
>
But switch-jump alone is not enough to get efficient VM interpreter.
The thing is this tiny bit at the end of every instruction code:
....
goto opcodes[pProgram[regs.PC++]];
This is instruction dispatch, the trick in the branch prediction that
operates on per branch basis, thus single switch-jump based VM dispatch
will mispredict jumps most of the time. I seen claims of up to 99% on
average.
If you place a whole switch at the end of every instruction code I'm not
sure compiler will find it's way out of this mess, or even optimize it.
I tried that with DMD, the problem is it have no idea how to use the
*same* jump *table* for all of identical switches.
> In D, final switch might enable such an optimization with statically
> checking for out-of-enum values.
--
Dmitry Olshansky
More information about the Digitalmars-d
mailing list