Computed gotos on Reddit

Dmitry Olshansky dmitry.olsh at gmail.com
Wed Jul 25 10:29:33 PDT 2012


On 25-Jul-12 21:19, Walter Bright wrote:
> On 7/25/2012 4:26 AM, Dmitry Olshansky wrote:
>> On 25-Jul-12 15:14, Don Clugston wrote:
>>> On 25/07/12 12:11, Walter Bright wrote:
>>>> On 7/25/2012 12:51 AM, Don Clugston wrote:
>>>>> so that there is no lookup table, just a multiply.
>>>>
>>>> Rethinking your idea a bit...
>>>>
>>>> Suppose the switch jump_address[] array was really an array of
>>>> hardcoded
>>>> jmp instructions, 5 bytes each:
>>>>
>>>>    jmp_table:
>>>>      jmp Lcase1;
>>>>      jmp Lcase2;
>>>>      jmp Lcase3;
>>>>      ...
>>>>
>>>> and then the switch(EBX) would be:
>>>>
>>>>      lea EAX,jmp_table[EBX][EBX*4]
>>>>      jmp EAX
>>>>
>>>> is that kick-ass or what?
>>>>
>>>> (There'd be some additional complication for PIC code.)
>>>
>>> Very nice. The jumps in the jump table take effectively zero cycles.
>>> That looks quite doable.
>>
>> Looks neat. I'd more then willing to test how it affects my tiny VM in
>> std.regex.
>>
>
> Is it possible you could code it up and test it using inline asm?

Mm... I could try. So the trick is to add say this:
Dispatch:
asm{
       ...
      lea EAX,jmp_table[EBX][EBX*4]
      jmp EAX
jmp_table:
       jmp Lcase1;
       jmp Lcase2;
       jmp Lcase3;
}
Lcase1:
	...
	goto Dispatch
instead of current switch and replace case with labels. Sounds not half bad.

Then I could even replace that one goto Dispatch with same
      lea EAX,jmp_table[EBX][EBX*4]
      jmp EAX

I'll give it a shot. The only thing that worries me is that I will step 
on compiler's toes breaking his register allocation scheme (it would 
have to work around my inline asm).
Any tips on which spare registers to use (I guess ecx is no go, as there 
is 'this' pointer present) ?

-- 
Dmitry Olshansky


More information about the Digitalmars-d mailing list