DEV Community

Discussion on: Three bytes to an integer

Collapse
 
juarezr profile image
Juarez Rudsatz

The compiler is able to optimize both forms of get_cert_length to same code.

Check this playground

playground::get_cert_length_mul:
    pushq   %rax
    cmpq    $13, %rsi
    jb  .LBB8_4
    je  .LBB8_5
    cmpq    $15, %rsi
    jb  .LBB8_6
    movzbl  12(%rdi), %eax
    movzbl  13(%rdi), %esi
    movzbl  14(%rdi), %edx
    movl    %eax, %edi
    popq    %rax
    jmp playground::get2_cert_length_mul

playground::get_cert_length_shift:
    pushq   %rax
    cmpq    $13, %rsi
    jb  .LBB9_4
    je  .LBB9_5
    cmpq    $15, %rsi
    jb  .LBB9_6
    movzbl  12(%rdi), %eax
    movzbl  13(%rdi), %esi
    movzbl  14(%rdi), %edx
    movl    %eax, %edi
    popq    %rax
    jmp playground::get2_cert_length_mul

playground::get2_cert_length_mul:
    shll    $16, %edi
    shll    $8, %esi
    leal    (%rsi,%rdi), %eax
    addl    %edx, %eax
    retq
Collapse
 
wayofthepie profile image
wayofthepie

Yip that makes sense. The shift vs multiply versions were more about which one looks less magical 😄