Skip to content

Instantly share code, notes, and snippets.

@dannas
Last active September 11, 2020 20:10
Show Gist options
  • Save dannas/a60dbfdfcd03420cb5df87964298994f to your computer and use it in GitHub Desktop.
Save dannas/a60dbfdfcd03420cb5df87964298994f to your computer and use it in GitHub Desktop.
int sum1(int a[], size_t N) {
    int s = 0;
    for (size_t i = 0; i < N; i++) {
        s += a[i];
    }
    return s;
}

gcc -O0 "Jump to Middle"

sum1:
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-24], rdi
        mov     QWORD PTR [rbp-32], rsi
        mov     DWORD PTR [rbp-4], 0
        mov     QWORD PTR [rbp-16], 0
        jmp     .L2
.L3:
        mov     rax, QWORD PTR [rbp-16]
        lea     rdx, [0+rax*4]
        mov     rax, QWORD PTR [rbp-24]
        add     rax, rdx
        mov     eax, DWORD PTR [rax]
        add     DWORD PTR [rbp-4], eax
        add     QWORD PTR [rbp-16], 1
.L2:
        mov     rax, QWORD PTR [rbp-16]
        cmp     rax, QWORD PTR [rbp-32]
        jb      .L3
        mov     eax, DWORD PTR [rbp-4]
        pop     rbp
        ret
goto test;
loop:
    body-stmt
test:
    if (test-expr)
        goto loop
done:

gcc -Og

sum1:
        mov     eax, 0
        mov     edx, 0
.L2:
        cmp     rax, rsi
        jnb     .L4
        add     edx, DWORD PTR [rdi+rax*4]
        add     rax, 1
        jmp     .L2
.L4:
        mov     eax, edx
        ret
loop:
  if (test-expr)
      goto done
  body-statement
  goto loop;
done;

gcc -Os

sum1:
        xor     eax, eax
        xor     r8d, r8d
.L2:
        cmp     rax, rsi
        je      .L5
        add     r8d, DWORD PTR [rdi+rax*4]
        inc     rax
        jmp     .L2
.L5:
        mov     eax, r8d
        ret
loop:
    if (test-expr)
        goto done
    body-stmt
    goto loop:
done:

gcc -O2 "Guarded do

sum1:
        test    rsi, rsi
        je      .L4
        lea     rdx, [rdi+rsi*4]
        xor     eax, eax
.L3:
        add     eax, DWORD PTR [rdi]
        add     rdi, 4
        cmp     rdi, rdx
        jne     .L3
        ret
.L4:
        xor     eax, eax
        ret
if (!test-expr)
    goto done;
loop:
    body-stmt;
    if (test-expr)
        goto loop;
done:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment