Do you have a proof? (Show me asm code)

Just to be more clear, what I mean is that given a D program equivalent to the C code shown in the article:


int interp_cgoto(unsigned char* code, int initval) {
    static const void* dispatch_table[] = {
        &&do_halt, &&do_inc, &&do_dec, &&do_mul2,
        &&do_div2, &&do_add7, &&do_neg};

    #define DISPATCH() goto *dispatch_table[code[pc++]]

    int pc = 0;
    int val = initval;

    DISPATCH();

    do_halt:
        return val;
    do_inc:
        val++;
        DISPATCH();
    do_dec:
        val--;
        DISPATCH();
    do_mul2:
        val *= 2;
        DISPATCH();
    do_div2:
        val /= 2;
        DISPATCH();
    do_add7:
        val += 7;
        DISPATCH();
    do_neg:
        val = -val;
        DISPATCH();
}

int main() {return 0;}


Is a 32 bit D compiler producing asm (with performance) similar to:


_interp_cgoto:
    movl    4(%esp), %edx
    movzbl  (%edx), %eax
    addl    $1, %edx
    movl    _dispatch_table.1363(,%eax,4), %ecx
    movl    8(%esp), %eax
    jmp *%ecx
    .p2align 4,,7
L3:
    rep
    ret
    .p2align 4,,7
L4:
    movzbl  (%edx), %ecx
    addl    $1, %eax
    movl    _dispatch_table.1363(,%ecx,4), %ecx
    .p2align 4,,7
L5:
    addl    $1, %edx
    jmp *%ecx
    .p2align 4,,7
L6:
    movzbl  (%edx), %ecx
    subl    $1, %eax
    movl    _dispatch_table.1363(,%ecx,4), %ecx
    addl    $1, %edx
    jmp *%ecx
    .p2align 4,,7
L7:
    movzbl  (%edx), %ecx
    addl    %eax, %eax
    movl    _dispatch_table.1363(,%ecx,4), %ecx
    addl    $1, %edx
    jmp *%ecx
    .p2align 4,,7
L8:
    movl    %eax, %ecx
    shrl    $31, %ecx
    addl    %ecx, %eax
    movzbl  (%edx), %ecx
    sarl    %eax
    movl    _dispatch_table.1363(,%ecx,4), %ecx
    addl    $1, %edx
    jmp *%ecx
    .p2align 4,,7
L9:
    movzbl  (%edx), %ecx
    addl    $7, %eax
    movl    _dispatch_table.1363(,%ecx,4), %ecx
    addl    $1, %edx
    jmp *%ecx
    .p2align 4,,7
L10:
    movzbl  (%edx), %ecx
    negl    %eax
    movl    _dispatch_table.1363(,%ecx,4), %ecx
    addl    $1, %edx
    jmp *%ecx

    .section .rdata,"dr"
    .align 4
_dispatch_table.1363:
    .long   L3
    .long   L4
    .long   L6
    .long   L7
    .long   L8
    .long   L9
    .long   L10


Bye,
bearophile

Reply via email to