Computed gotos on Reddit

Walter Bright newshound2 at digitalmars.com
Wed Jul 25 23:24:52 PDT 2012


On 7/25/2012 10:19 AM, Walter Bright wrote:
> Is it possible you could code it up and test it using inline asm?

I dummied up some code to do it:

int test(int i)
{
     switch (i)
     {
         case 3: i += 3; break;
         case 4: i += 4; break;
         case 5: i += 5; break;
         case 6: i += 6; break;
         case 7: i += 7; break;
         case 8: i += 8; break;
         default: i += 100; break;
     }
     return i;
}

                 enter   4,0
                 push    EBX
                 mov     -4[EBP],EAX
                 mov     EBX,EAX
                 sub     EBX,3
                 cmp     EBX,5
                 ja      L5D
                 lea     ECX,_D3foo4testFiZi[01Bh][EBX*4][EBX]
                 jmp     ECX
                 jmp     near ptr L39
                 jmp     near ptr L3F
                 jmp     near ptr L45
                 jmp     near ptr L4B
                 jmp     near ptr L51
                 jmp     near ptr L57
L39:            add     dword ptr -4[EBP],3
                 jmp short       L61
L3F:            add     dword ptr -4[EBP],4
                 jmp short       L61
L45:            add     dword ptr -4[EBP],5
                 jmp short       L61
L4B:            add     dword ptr -4[EBP],6
                 jmp short       L61
L51:            add     dword ptr -4[EBP],7
                 jmp short       L61
L57:            add     dword ptr -4[EBP],8
                 jmp short       L61
L5D:            add     dword ptr -4[EBP],064h
L61:            mov     EAX,-4[EBP]
                 pop     EBX
                 leave
                 ret

===============================================
Sadly, it's significantly slower than:

                 enter   4,0
                 push    EBX
                 mov     -4[EBP],EAX
                 mov     EBX,EAX
                 sub     EBX,3
                 cmp     EBX,5
                 ja      L3D
                 jmp     dword ptr FLAT:_DATA[00h][EBX*4]
                 add     dword ptr -4[EBP],3
                 jmp short       L41
                 add     dword ptr -4[EBP],4
                 jmp short       L41
                 add     dword ptr -4[EBP],5
                 jmp short       L41
                 add     dword ptr -4[EBP],6
                 jmp short       L41
                 add     dword ptr -4[EBP],7
                 jmp short       L41
                 add     dword ptr -4[EBP],8
                 jmp short       L41
L3D:            add     dword ptr -4[EBP],064h
L41:            mov     EAX,-4[EBP]
                 pop     EBX
                 leave
                 ret

Maybe the branch prediction logic doesn't work for JMP ECX.


More information about the Digitalmars-d mailing list