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