Computed gotos on Reddit

Dmitry Olshansky dmitry.olsh at gmail.com
Wed Jul 25 00:55:54 PDT 2012


On 25-Jul-12 11:51, Don Clugston wrote:
> On 25/07/12 09:37, Walter Bright wrote:
>> On 7/24/2012 11:46 PM, Dmitry Olshansky wrote:
>>> It's pc => address because one can first preprocess all of byte code
>>> doing
>>> opcode => address rewrites. But you can't do it unless taking address
>>> of labels
>>> is possible.
>>
>> All right, that's the piece that was missing.
>>
>> I suppose it is possible for the compiler to recognize that the
>> opcode=>address array is invariant, and optimize it out, but that would
>> be a novel optimization. I don't know how hard it would be.
>>
>>
>>  > Done: http://d.puremagic.com/issues/show_bug.cgi?id=8431
>>
>> Thanks!
>
> Another interesting optimization with "final switch" would be if each
> case has about the same code length.
>
> final switch(x) {
> case C1:  ...
> case C2:  ...
> case C3:  ...
> case C4:  ...
> }
> then if &(case c2) - &(case C1) == &(case C3) - &(case C2)
>
> change it to
> goto (&case C1) + x *( &(case c2) - &(case C1) );
>
> so that there is no lookup table, just a multiply.

Could be interesting if some other simple progressions could be 
hardcoded, if say branches are be sorted by length. Also modern CPU seem 
to be exceptionally fast at skipping NOPs so a bit of padding won't hurt.

-- 
Dmitry Olshansky


More information about the Digitalmars-d mailing list