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