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.

Reply via email to