* The compiler recognized that we were doing math once the results were in a single variable
* `leaq` (load effective address) is an address calculation that does addition and multiplication in one step
* `28(%rdx,%rax,8)` calculates `rdx+28+8*rax`
* `%rdx` is sum, `%rax` is i,
* Equivalent to `sum += 8*i + 28`
```asm
.L3:
leaq 28(%rdx,%rax,8), %rdx
addq $8, %rax
cmpl %eax, %ecx
jg .L3
leal -9(%rsi), %ecx
andl $-8, %ecx
addl $9, %ecx
```
---
## O3 Alternative
* The -O3 optimization uses a different set of optimizations
* Uses the special `xmm` (multimedia) registers
* Not an optimization in this case, but usually is
```asm
.file "add_sum7.c"
.text
.p2align 4
.globl addSum
.type addSum, @function
addSum:
.LFB39:
.cfi_startproc
endbr64
leal -7(%rsi), %r9d
movl %esi, %ecx
cmpl $1, %r9d
jle .L9
leal -9(%rsi), %eax
movl %eax, %r8d
shrl $3, %r8d
leal 1(%r8), %esi
cmpl $23, %eax
jbe .L10
pxor %xmm3, %xmm3
movl %esi, %edx
pxor %xmm10, %xmm10
xorl %eax, %eax
shrl $2, %edx
movaps %xmm3, -88(%rsp)
movdqa %xmm3, %xmm15
movdqa .LC0(%rip), %xmm11
.p2align 4,,10
.p2align 3
.L4:
movdqa %xmm11, %xmm2
movdqa %xmm10, %xmm1
addl $1, %eax
movdqa .LC2(%rip), %xmm0
pcmpgtd %xmm2, %xmm1
movdqa %xmm2, %xmm13
movdqa .LC3(%rip), %xmm8
movdqa .LC4(%rip), %xmm7
paddd %xmm2, %xmm0
movdqa %xmm10, %xmm14
movdqa .LC5(%rip), %xmm6
movdqa .LC6(%rip), %xmm5
paddd %xmm2, %xmm8
movdqa %xmm0, %xmm9
paddd %xmm2, %xmm7
movdqa .LC7(%rip), %xmm4
punpckldq %xmm1, %xmm13
movaps %xmm1, -72(%rsp)
paddd %xmm2, %xmm6
paddd %xmm2, %xmm5
movdqa %xmm13, %xmm1
movdqa %xmm10, %xmm13
paddd %xmm2, %xmm4
movdqa .LC8(%rip), %xmm3
pcmpgtd %xmm0, %xmm13
pcmpgtd %xmm8, %xmm14
paddq %xmm15, %xmm1
movdqa %xmm10, %xmm15
movdqa %xmm10, %xmm12
paddd %xmm2, %xmm3
pcmpgtd %xmm7, %xmm15
pcmpgtd %xmm4, %xmm12
punpckhdq -72(%rsp), %xmm2
punpckldq %xmm13, %xmm9
movaps %xmm14, -40(%rsp)
paddq -88(%rsp), %xmm2
paddd .LC1(%rip), %xmm11
paddq %xmm9, %xmm1
movdqa %xmm8, %xmm9
movaps %xmm13, -56(%rsp)
punpckhdq -56(%rsp), %xmm0
punpckldq %xmm14, %xmm9
punpckhdq -40(%rsp), %xmm8
movaps %xmm15, -24(%rsp)
paddq %xmm9, %xmm1
movdqa %xmm7, %xmm9
paddq %xmm2, %xmm0
punpckldq %xmm15, %xmm9
punpckhdq -24(%rsp), %xmm7
paddq %xmm8, %xmm0
paddq %xmm9, %xmm1
movdqa %xmm10, %xmm9
movdqa %xmm3, %xmm15
pcmpgtd %xmm6, %xmm9
paddq %xmm7, %xmm0
movdqa %xmm9, %xmm14
movdqa %xmm6, %xmm9
punpckldq %xmm14, %xmm9
punpckhdq %xmm14, %xmm6
paddq %xmm9, %xmm1
movdqa %xmm10, %xmm9
paddq %xmm0, %xmm6
pcmpgtd %xmm5, %xmm9
movdqa %xmm9, %xmm13
movdqa %xmm5, %xmm9
punpckldq %xmm13, %xmm9
punpckhdq %xmm13, %xmm5
paddq %xmm9, %xmm1
movdqa %xmm4, %xmm9
paddq %xmm6, %xmm5
punpckldq %xmm12, %xmm9
punpckhdq %xmm12, %xmm4
paddq %xmm9, %xmm1
movdqa %xmm10, %xmm9
paddq %xmm5, %xmm4
pcmpgtd %xmm3, %xmm9
punpckhdq %xmm9, %xmm3
punpckldq %xmm9, %xmm15
paddq %xmm3, %xmm4
paddq %xmm1, %xmm15
movaps %xmm4, -88(%rsp)
cmpl %edx, %eax
jne .L4
paddq -88(%rsp), %xmm15
movdqa %xmm15, %xmm0
psrldq $8, %xmm0
paddq %xmm0, %xmm15
movq %xmm15, %rax
testb $3, %sil
je .L6
andl $-4, %esi
leal 1(,%rsi,8), %edx
.L3:
movslq %edx, %rsi
addq %rax, %rsi
leal 1(%rdx), %eax
cltq
addq %rsi, %rax
leal 2(%rdx), %esi
movslq %esi, %rsi
addq %rax, %rsi
leal 3(%rdx), %eax
cltq
addq %rsi, %rax
leal 4(%rdx), %esi
movslq %esi, %rsi
addq %rax, %rsi
leal 5(%rdx), %eax
cltq
addq %rsi, %rax
leal 6(%rdx), %esi
movslq %esi, %rsi
addq %rax, %rsi
leal 7(%rdx), %eax
cltq
addq %rsi, %rax
leal 8(%rdx), %esi
cmpl %esi, %r9d
jle .L6
movslq %esi, %rsi
addq %rax, %rsi
leal 9(%rdx), %eax
cltq
addq %rsi, %rax
leal 10(%rdx), %esi
movslq %esi, %rsi
addq %rax, %rsi
leal 11(%rdx), %eax
cltq
addq %rsi, %rax
leal 12(%rdx), %esi
movslq %esi, %rsi
addq %rax, %rsi
leal 13(%rdx), %eax
cltq
addq %rsi, %rax
leal 14(%rdx), %esi
movslq %esi, %rsi
addq %rax, %rsi
leal 15(%rdx), %eax
cltq
addq %rsi, %rax
leal 16(%rdx), %esi
cmpl %esi, %r9d
jle .L6
movslq %esi, %rsi
addq %rax, %rsi
leal 17(%rdx), %eax
cltq
addq %rax, %rsi
leal 18(%rdx), %eax
cltq
addq %rsi, %rax
leal 19(%rdx), %esi
movslq %esi, %rsi
addq %rax, %rsi
leal 20(%rdx), %eax
cltq
addq %rsi, %rax
leal 21(%rdx), %esi
movslq %esi, %rsi
addq %rax, %rsi
leal 22(%rdx), %eax
addl $23, %edx
cltq
movslq %edx, %rdx
addq %rsi, %rax
addq %rdx, %rax
.L6:
leal 9(,%r8,8), %edx
.L2:
cmpl %edx, %ecx
jle .L7
movslq %edx, %rsi
addq %rsi, %rax
leal 1(%rdx), %esi
cmpl %ecx, %esi
jge .L7
movslq %esi, %rsi
addq %rsi, %rax
leal 2(%rdx), %esi
cmpl %esi, %ecx
jle .L7
movslq %esi, %rsi
addq %rsi, %rax
leal 3(%rdx), %esi
cmpl %ecx, %esi
jge .L7
movslq %esi, %rsi
addq %rsi, %rax
leal 4(%rdx), %esi
cmpl %ecx, %esi
jge .L7
movslq %esi, %rsi
addq %rsi, %rax
leal 5(%rdx), %esi
cmpl %esi, %ecx
jle .L7
movslq %esi, %rsi
addq %rsi, %rax
leal 6(%rdx), %esi
cmpl %esi, %ecx
jle .L7
movslq %esi, %rsi
addl $7, %edx
addq %rsi, %rax
movslq %edx, %rsi
addq %rax, %rsi
cmpl %edx, %ecx
cmovg %rsi, %rax
.L7:
addq %rax, (%rdi)
ret
.p2align 4,,10
.p2align 3
.L9:
movl $1, %edx
xorl %eax, %eax
jmp .L2
.L10:
movl $1, %edx
xorl %eax, %eax
jmp .L3
.cfi_endproc
.LFE39:
.size addSum, .-addSum
.section .rodata.str1.8,"aMS",@progbits,1
.align 8
.LC9:
.string "This program requires a positive number as its second argument."
.section .rodata.str1.1,"aMS",@progbits,1
.LC10:
.string "%lli\n"
.section .text.startup,"ax",@progbits
.p2align 4
.globl main
.type main, @function
main:
.LFB40:
.cfi_startproc
endbr64
subq $24, %rsp
.cfi_def_cfa_offset 32
movq %fs:40, %rax
movq %rax, 8(%rsp)
xorl %eax, %eax
cmpl $1, %edi
jle .L22
movq 8(%rsi), %rdi
movl $10, %edx
xorl %esi, %esi
movq $0, (%rsp)
call strtol@PLT
movq %rsp, %rdi
movl %eax, %esi
call addSum
movq (%rsp), %rdx
movl $2, %edi
xorl %eax, %eax
leaq .LC10(%rip), %rsi
call __printf_chk@PLT
.L19:
movq 8(%rsp), %rax
subq %fs:40, %rax
jne .L23
xorl %eax, %eax
addq $24, %rsp
.cfi_remember_state
.cfi_def_cfa_offset 8
ret
.L22:
.cfi_restore_state
leaq .LC9(%rip), %rdi
call puts@PLT
jmp .L19
.L23:
call __stack_chk_fail@PLT
.cfi_endproc
.LFE40:
.size main, .-main
.section .rodata.cst16,"aM",@progbits,16
.align 16
.LC0:
.long 1
.long 9
.long 17
.long 25
.align 16
.LC1:
.long 32
.long 32
.long 32
.long 32
.align 16
.LC2:
.long 1
.long 1
.long 1
.long 1
.align 16
.LC3:
.long 2
.long 2
.long 2
.long 2
.align 16
.LC4:
.long 3
.long 3
.long 3
.long 3
.align 16
.LC5:
.long 4
.long 4
.long 4
.long 4
.align 16
.LC6:
.long 5
.long 5
.long 5
.long 5
.align 16
.LC7:
.long 6
.long 6
.long 6
.long 6
.align 16
.LC8:
.long 7
.long 7
.long 7
.long 7
.ident "GCC: (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0"
.section .note.GNU-stack,"",@progbits
.section .note.gnu.property,"a"
.align 8
.long 1f - 0f
.long 4f - 1f
.long 5
0:
.string "GNU"
1:
.align 8
.long 0xc0000002
.long 3f - 2f
2:
.long 0x3
3:
.align 8
4:
```
---
## Doing Math On Our Own
```C
#include