_Z3foov:
.LFB1618:
    pushl   %ebp
.LCFI0:
    movl    %esp, %ebp
.LCFI1:
    pushl   %esi
.LCFI2:
    pushl   %ebx
.LCFI3:
    movl    external_data, %ebx
    movl    32(%ebx), %esi
    movl    28(%ebx), %ecx
    movl    -32(%ebx), %edx
    movl    -28(%ebx), %eax
    addl    %esi, %edx              #d = data[8] + data[-8]
    movl    24(%ebx), %esi
    addl    %ecx, %eax              #a = data[7] + data[-7]
    movl    20(%ebx), %ecx
    leal    (%edx,%edx,2), %edx     #d *= 3
    leal    (%eax,%eax,2), %eax     #a *= 3
    leal    (%edx,%eax,4), %eax     #a = d + a*4    -> a  = 3*(data[8] + data[-8]) + 12*(data[7] + data[-7])
    movl    -24(%ebx), %edx
    addl    %esi, %edx              #d = data[6] + data[-6]
    movl    16(%ebx), %esi
    leal    (%edx,%edx,8), %edx     #d *= 9
    leal    (%eax,%edx,4), %edx     #d = a + 4 * d  -> d = ... + 12*(data[7] + data[-7]) + 36*(data[6] + data[-6])
    movl    -20(%ebx), %eax
    addl    %ecx, %eax              #a = data[5] + data[-5]
    leal    (%eax,%eax,4), %ecx     #c = a * 5
    leal    (%eax,%ecx,2), %ecx     #c = a + c * 2  -> c = 11 * (data[5] + data[-5])
    leal    (%edx,%ecx,8), %ecx     #c *= 8 + d     -> c = 88 * (...) + 36*(...) + ...
    movl    -16(%ebx), %edx         
    addl    %esi, %edx              #d = data[4] + data[-4]     
    leal    (%edx,%edx,2), %esi     #s = d * 3
    movl    %esi, %eax              #a = s
    sall    $4, %eax                #a = a * 16
    subl    %esi, %eax              #a = a - s      -> a = 15*3*d
    movl    8(%ebx), %esi           
    leal    (%edx,%eax,4), %eax     #a = a * 4 + d  -> a = 181 * (data[4] + data[-4])
    movl    12(%ebx), %edx
    addl    %eax, %ecx              #c = a + c      -> c = 181 * (data[4] + data[-4]) + 88 *(data[5] + data[-5]) + ...
    movl    -12(%ebx), %eax
    addl    %edx, %eax
    movl    4(%ebx), %edx
    imull   $318, %eax, %eax        
    addl    %eax, %ecx              #c += 318 * (data[3] + data[-3])
    movl    -8(%ebx), %eax
    addl    %esi, %eax
    imull   $474, %eax, %eax
    addl    %eax, %ecx              #c += 474 * (data[2] + data[-2])
    movl    -4(%ebx), %eax
    addl    %edx, %eax
    movl    (%ebx), %edx
    imull   $603, %eax, %eax        #a = 603 * (data[1] + data[-1])
    popl    %ebx
    popl    %esi
    addl    %eax, %ecx              #c += a         -> c = 603*... + 474*... + ... 
    leal    (%edx,%edx,8), %eax     #a = data[0] * 9
    leal    (%eax,%eax,8), %eax     #a = a * 9      -> a = 81*data[0]
    leal    (%edx,%eax,2), %eax     #a = a*2 + d    -> a = 163*data[0]
    leal    (%edx,%eax,4), %eax     #a = a*4 + d    -> a = 652*data[0]
    addl    %eax, %ecx              #c += a         -> c = 652*... + 603*... + ...
    movl    %ecx, %eax              #a = c
    sarl    $31, %eax
    shrl    $20, %eax
    popl    %ebp
    addl    %ecx, %eax
    sarl    $12, %eax               #a /= 4096      -> a = (652*... + ...)/4069
    movl    %eax, external_num
    ret
