Skip to content

Instantly share code, notes, and snippets.

@terickson001
Last active September 22, 2020 19:49
Show Gist options
  • Save terickson001/c93a9839981ed4ce424c7fba251ac1ab to your computer and use it in GitHub Desktop.
Save terickson001/c93a9839981ed4ce424c7fba251ac1ab to your computer and use it in GitHub Desktop.
Fibonacci C vs. Odin
define dso_local i64 @fib(i64 %0) #0 {
%2 = alloca i64, align 8
%3 = alloca i64, align 8
store i64 %0, i64* %3, align 8
%4 = load i64, i64* %3, align 8
%5 = icmp eq i64 %4, 0
br i1 %5, label %6, label %7
6: ; preds = %1
store i64 0, i64* %2, align 8
br label %19
7: ; preds = %1
%8 = load i64, i64* %3, align 8
%9 = icmp eq i64 %8, 1
br i1 %9, label %10, label %11
10: ; preds = %7
store i64 1, i64* %2, align 8
br label %19
11: ; preds = %7
%12 = load i64, i64* %3, align 8
%13 = sub i64 %12, 1
%14 = call i64 @fib(i64 %13)
%15 = load i64, i64* %3, align 8
%16 = sub i64 %15, 2
%17 = call i64 @fib(i64 %16)
%18 = add i64 %14, %17
store i64 %18, i64* %2, align 8
br label %19
19: ; preds = %11, %10, %6
%20 = load i64, i64* %2, align 8
ret i64 %20
}
define dso_local i64 @fib2(i64 %0) #0 {
%2 = alloca i64, align 8
%3 = alloca i64, align 8
%4 = alloca i64, align 8
%5 = alloca i64, align 8
store i64 %0, i64* %2, align 8
store i64 0, i64* %3, align 8
store i64 1, i64* %4, align 8
br label %6
6: ; preds = %10, %1
%7 = load i64, i64* %2, align 8
%8 = add i64 %7, -1
store i64 %8, i64* %2, align 8
%9 = icmp ne i64 %7, 0
br i1 %9, label %10, label %16
10: ; preds = %6
%11 = load i64, i64* %4, align 8
store i64 %11, i64* %5, align 8
%12 = load i64, i64* %3, align 8
%13 = load i64, i64* %4, align 8
%14 = add i64 %12, %13
store i64 %14, i64* %4, align 8
%15 = load i64, i64* %5, align 8
store i64 %15, i64* %3, align 8
br label %6
16: ; preds = %6
%17 = load i64, i64* %3, align 8
ret i64 %17
}
fib:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
pushq %rbx
subq $24, %rsp
.cfi_offset 3, -24
movq %rdi, -24(%rbp)
cmpq $0, -24(%rbp)
jne .L2
movl $0, %eax
jmp .L3
.L2:
cmpq $1, -24(%rbp)
jne .L4
movl $1, %eax
jmp .L3
.L4:
movq -24(%rbp), %rax
subq $1, %rax
movq %rax, %rdi
call fib
movq %rax, %rbx
movq -24(%rbp), %rax
subq $2, %rax
movq %rax, %rdi
call fib
addq %rbx, %rax
.L3:
movq -8(%rbp), %rbx
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size fib, .-fib
.globl fib2
.type fib2, @function
#include <stdio.h>
unsigned long fib(unsigned long l)
{
if (l == 0) return 0;
if (l == 1) return 1;
return fib(l-1) + fib(l-2);
}
unsigned long fib2(unsigned long l)
{
unsigned long a, b, c;
a = 0; b = 1;
while (l--)
{
c = b;
b = a + b;
a = c;
}
return a;
}
int main(void)
{
unsigned long res = fib2(45);
printf("%ld\n", res);
return 0;
}
package main
import "core:fmt"
import "core:time"
fib :: proc(l: u64) -> u64
{
if l == 0 do return 0;
if l == 1 do return 1;
return fib(l - 1) + fib(l - 2);
}
fib2 :: proc(l: u64) -> u64
{
l := l;
a: u64 = 0;
b: u64 = 1;
c: u64 = ---;
for (l != 0)
{
c = b;
b = a + b;
a = c;
l -= 1;
}
return a;
}
main :: proc()
{
start := time.now();
res := fib(45);
end := time.now();
fmt.println(res, time.duration_seconds(time.diff(start, end)));
}
define i64 @main.fib(i64 %_.0, %runtime.Context* noalias nonnull nocapture %__.context_ptr) #0 {
decls-0:
%0 = alloca i64, align 16
store i64 %_.0, i64* %0
; IfStmt
%1 = load i64, i64* %0, align 8
%2 = icmp eq i64 %1, 0
%3 = zext i1 %2 to i8
%4 = trunc i8 %3 to i1
br i1 %4, label %if.then-1, label %if.done-2
if.then-1:
; ReturnStmt
ret i64 0
if.done-2:
; IfStmt
%5 = load i64, i64* %0, align 8
%6 = icmp eq i64 %5, 1
%7 = zext i1 %6 to i8
%8 = trunc i8 %7 to i1
br i1 %8, label %if.then-3, label %if.done-4
if.then-3:
; ReturnStmt
ret i64 1
if.done-4:
; ReturnStmt
%9 = load i64, i64* %0, align 8
%10 = sub i64 %9, 1
%11 = call i64 @main.fib(i64 %10, %runtime.Context* noalias nonnull nocapture %__.context_ptr)
%12 = load i64, i64* %0, align 8
%13 = sub i64 %12, 2
%14 = call i64 @main.fib(i64 %13, %runtime.Context* noalias nonnull nocapture %__.context_ptr)
%15 = add i64 %11, %14
ret i64 %15
}
define i64 @main.fib2(i64 %_.0, %runtime.Context* noalias nonnull nocapture %__.context_ptr) #0 {
decls-0:
%0 = alloca i64, align 16
%1 = alloca i64, align 16
%2 = alloca i64, align 16
%3 = alloca i64, align 16
%4 = alloca i64, align 16
store i64 %_.0, i64* %0
; l
; ZeroInit
store i64 zeroinitializer, i64* %1, align 1
%5 = load i64, i64* %0, align 8
store i64 %5, i64* %1
; a
; ZeroInit
store i64 zeroinitializer, i64* %2, align 1
store i64 0, i64* %2
; b
; ZeroInit
store i64 zeroinitializer, i64* %3, align 1
store i64 1, i64* %3
; c
; ZeroInit
store i64 zeroinitializer, i64* %4, align 1
store i64 undef, i64* %4
; ForStmt
br label %for.loop-1
for.loop-1:
%6 = load i64, i64* %1, align 8
%7 = icmp ne i64 %6, 0
%8 = zext i1 %7 to i8
%9 = trunc i8 %8 to i1
br i1 %9, label %for.body-2, label %for.done-3
for.body-2:
; AssignStmt
%10 = load i64, i64* %3, align 8
store i64 %10, i64* %4
; AssignStmt
%11 = load i64, i64* %2, align 8
%12 = load i64, i64* %3, align 8
%13 = add i64 %11, %12
store i64 %13, i64* %3
; AssignStmt
%14 = load i64, i64* %4, align 8
store i64 %14, i64* %2
; AssignStmt
%15 = load i64, i64* %1, align 8
%16 = sub i64 %15, 1
store i64 %16, i64* %1
br label %for.loop-1
for.done-3:
; ReturnStmt
%17 = load i64, i64* %2, align 8
ret i64 %17
}
main.fib: # @main.fib
.cfi_startproc
# %bb.0: # %decls-0
pushq %r14
.cfi_def_cfa_offset 16
pushq %rbx
.cfi_def_cfa_offset 24
pushq %rax
.cfi_def_cfa_offset 32
.cfi_offset %rbx, -24
.cfi_offset %r14, -16
movq %rdi, (%rsp)
testq %rdi, %rdi
jne .LBB74_3
# %bb.1: # %if.then-1
xorl %eax, %eax
jmp .LBB74_2
.LBB74_3: # %if.done-2
cmpq $1, (%rsp)
jne .LBB74_5
# %bb.4: # %if.then-3
movl $1, %eax
jmp .LBB74_2
.LBB74_5: # %if.done-4
movq %rsi, %rbx
movq (%rsp), %rdi
decq %rdi
callq main.fib
movq %rax, %r14
movq (%rsp), %rdi
addq $-2, %rdi
movq %rbx, %rsi
callq main.fib
addq %r14, %rax
.LBB74_2: # %if.then-1
addq $8, %rsp
.cfi_def_cfa_offset 24
popq %rbx
.cfi_def_cfa_offset 16
popq %r14
.cfi_def_cfa_offset 8
retq
.Lfunc_end74:
.size main.fib, .Lfunc_end74-main.fib
.cfi_endproc
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment