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.