Steve Kucera:

I am using DMD 2.062 on Windows 7 64-bit.

I am writing performance critical functions that need switch statements to use an indirect jump table... current I'm analysing the assembly dump, and the code is compiled to nested ifs instead. This happens with switch and final switch. Is there any way to force the compiler to use a jump table?

What kind of switch do you have? Are you switching on strings?

Here I am not seeing nested ifs, this is efficient enough:


import core.stdc.stdio: puts;
void main(string[] args) {
    switch (args.length) {
        case 0: puts("0"); break;
        case 1: puts("1"); break;
        case 2: puts("2"); break;
        case 3: puts("3"); break;
        default: puts("default"); break;
    }
}




main:
L0:     push    EAX
        push    EBX
        mov EBX,0Ch[ESP]
        cmp EBX,3
        push    ESI
        ja  L53
        jmp dword ptr FLAT:_DATA[018h][EBX*4]

        mov ESI,offset FLAT:_DATA
        push    ESI
        call    near ptr _puts
        add ESP,4
        jmp short   L61

        mov EDX,offset FLAT:_DATA[4]
        push    EDX
        call    near ptr _puts
        add ESP,4
        jmp short   L61

        mov ECX,offset FLAT:_DATA[8]
        push    ECX
        call    near ptr _puts
        add ESP,4
        jmp short   L61

        mov EAX,offset FLAT:_DATA[0Ch]
        push    EAX
        call    near ptr _puts
        add ESP,4
        jmp short   L61

L53:        mov EBX,offset FLAT:_DATA[010h]
        push    EBX
        call    near ptr _puts
        add ESP,4

L61:        pop ESI
        xor EAX,EAX
        pop EBX
        pop ECX
        ret


Bye,
bearophile

Reply via email to