int ft_atoi(char const *str) {
  long i;
  unsigned long nbr;
  int negative;
  i = 0;
  nbr = 0;
  negative = 1;
  while ((str[i] == '\n') || (str[i] == '\t') || (str[i] == '\v') ||
         (str[i] == ' ') || (str[i] == '\f') || (str[i] == '\r'))
    i++;
  if (str[i] == '-')
    negative = -1;
  if (str[i] == '+' || str[i] == '-')
    i++;
  while ((unsigned char)str[i] && (unsigned char)str[i] >= '0' &&
         (unsigned char)str[i] <= '9') {
    nbr *= 10;
    nbr += (long)((unsigned char)str[i] - '0');
    i++;
  }
  return ((int)(nbr * negative));
}


x86 assembly (clang, -O0):
<ft_atoi>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
movq   $0x0,-0x10(%rbp)
movq   $0x0,-0x18(%rbp)
movl   $0x1,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    $0xa,%ecx
mov    %al,-0x1d(%rbp)
je     11b6 <ft_atoi+0xb6>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    $0x9,%ecx
mov    %al,-0x1d(%rbp)
je     11b6 <ft_atoi+0xb6>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    $0xb,%ecx
mov    %al,-0x1d(%rbp)
je     11b6 <ft_atoi+0xb6>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x1d(%rbp)
je     11b6 <ft_atoi+0xb6>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    $0xc,%ecx
mov    %al,-0x1d(%rbp)
je     11b6 <ft_atoi+0xb6>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0xd,%eax
sete   %al
mov    %al,-0x1d(%rbp)
mov    -0x1d(%rbp),%al
test   $0x1,%al
jne    11c6 <ft_atoi+0xc6>
jmp    11d7 <ft_atoi+0xd7>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    111f <ft_atoi+0x1f>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    11f3 <ft_atoi+0xf3>
movl   $0xffffffff,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2b,%eax
je     121d <ft_atoi+0x11d>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    1229 <ft_atoi+0x129>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    122e <ft_atoi+0x12e>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
movzbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1e(%rbp)
je     1277 <ft_atoi+0x177>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
movzbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x1e(%rbp)
jl     1277 <ft_atoi+0x177>
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
setle  %al
mov    %al,-0x1e(%rbp)
mov    -0x1e(%rbp),%al
test   $0x1,%al
jne    1287 <ft_atoi+0x187>
jmp    12ba <ft_atoi+0x1ba>
imul   $0xa,-0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
cltq
add    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    122e <ft_atoi+0x12e>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
imul   %rcx,%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ft_atoi>:
mov    $0x1,%eax
jmp    1114 <ft_atoi+0x14>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rax
movzbl -0x1(%rdi,%rax,1),%ecx
lea    -0x9(%rcx),%edx
cmp    $0x5,%dl
jb     1110 <ft_atoi+0x10>
cmp    $0x20,%cl
je     1110 <ft_atoi+0x10>
cmp    $0x2b,%cl
je     113c <ft_atoi+0x3c>
cmp    $0x2d,%cl
jne    1146 <ft_atoi+0x46>
mov    $0xffffffffffffffff,%rdx
mov    (%rdi,%rax,1),%cl
jmp    114f <ft_atoi+0x4f>
mov    $0x1,%edx
mov    (%rdi,%rax,1),%cl
jmp    114f <ft_atoi+0x4f>
add    $0xffffffffffffffff,%rax
mov    $0x1,%edx
lea    -0x30(%rcx),%esi
cmp    $0x9,%sil
ja     1192 <ft_atoi+0x92>
lea    (%rax,%rdi,1),%rsi
add    $0x1,%rsi
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
lea    (%rax,%rax,4),%rax
movzbl %cl,%ecx
add    $0xffffffd0,%ecx
lea    (%rcx,%rax,2),%rax
movzbl (%rsi),%ecx
lea    -0x30(%rcx),%edi
add    $0x1,%rsi
cmp    $0xa,%dil
jb     1170 <ft_atoi+0x70>
imul   %edx,%eax
ret
xor    %eax,%eax
imul   %edx,%eax
ret

LLVM IR (-O0):
define i32 @ft_atoi(i8* %0) {
%2 = alloca i8*
%3 = alloca i64
%4 = alloca i64
%5 = alloca i32
store i8* %0, i8** %2
store i64 0, i64* %3
store i64 0, i64* %4
store i32 1, i32* %5
br label %6
6: ; preds = %50, %1
%7 = load i8*, i8** %2
%8 = load i64, i64* %3
%9 = getelementptr inbounds i8, i8* %7, i64 %8
%10 = load i8, i8* %9
%11 = sext i8 %10 to i32
%12 = icmp eq i32 %11, 10
br i1 %12, label %48, label %13
13: ; preds = %6
%14 = load i8*, i8** %2
%15 = load i64, i64* %3
%16 = getelementptr inbounds i8, i8* %14, i64 %15
%17 = load i8, i8* %16
%18 = sext i8 %17 to i32
%19 = icmp eq i32 %18, 9
br i1 %19, label %48, label %20
20: ; preds = %13
%21 = load i8*, i8** %2
%22 = load i64, i64* %3
%23 = getelementptr inbounds i8, i8* %21, i64 %22
%24 = load i8, i8* %23
%25 = sext i8 %24 to i32
%26 = icmp eq i32 %25, 11
br i1 %26, label %48, label %27
27: ; preds = %20
%28 = load i8*, i8** %2
%29 = load i64, i64* %3
%30 = getelementptr inbounds i8, i8* %28, i64 %29
%31 = load i8, i8* %30
%32 = sext i8 %31 to i32
%33 = icmp eq i32 %32, 32
br i1 %33, label %48, label %34
34: ; preds = %27
%35 = load i8*, i8** %2
%36 = load i64, i64* %3
%37 = getelementptr inbounds i8, i8* %35, i64 %36
%38 = load i8, i8* %37
%39 = sext i8 %38 to i32
%40 = icmp eq i32 %39, 12
br i1 %40, label %48, label %41
41: ; preds = %34
%42 = load i8*, i8** %2
%43 = load i64, i64* %3
%44 = getelementptr inbounds i8, i8* %42, i64 %43
%45 = load i8, i8* %44
%46 = sext i8 %45 to i32
%47 = icmp eq i32 %46, 13
br label %48
48: ; preds = %41, %34, %27, %20, %13, %6
%49 = phi i1 [ true, %34 ], [ true, %27 ], [ true, %20 ], [ true, %13 ], [ true, %6 ], [ %47, %41 ]
br i1 %49, label %50, label %53
50: ; preds = %48
%51 = load i64, i64* %3
%52 = add nsw i64 %51, 1
store i64 %52, i64* %3
br label %6
53: ; preds = %48
%54 = load i8*, i8** %2
%55 = load i64, i64* %3
%56 = getelementptr inbounds i8, i8* %54, i64 %55
%57 = load i8, i8* %56
%58 = sext i8 %57 to i32
%59 = icmp eq i32 %58, 45
br i1 %59, label %60, label %61
60: ; preds = %53
store i32 -1, i32* %5
br label %61
61: ; preds = %60, %53
%62 = load i8*, i8** %2
%63 = load i64, i64* %3
%64 = getelementptr inbounds i8, i8* %62, i64 %63
%65 = load i8, i8* %64
%66 = sext i8 %65 to i32
%67 = icmp eq i32 %66, 43
br i1 %67, label %75, label %68
68: ; preds = %61
%69 = load i8*, i8** %2
%70 = load i64, i64* %3
%71 = getelementptr inbounds i8, i8* %69, i64 %70
%72 = load i8, i8* %71
%73 = sext i8 %72 to i32
%74 = icmp eq i32 %73, 45
br i1 %74, label %75, label %78
75: ; preds = %68, %61
%76 = load i64, i64* %3
%77 = add nsw i64 %76, 1
store i64 %77, i64* %3
br label %78
78: ; preds = %75, %68
br label %79
79: ; preds = %102, %78
%80 = load i8*, i8** %2
%81 = load i64, i64* %3
%82 = getelementptr inbounds i8, i8* %80, i64 %81
%83 = load i8, i8* %82
%84 = zext i8 %83 to i32
%85 = icmp ne i32 %84, 0
br i1 %85, label %86, label %100
86: ; preds = %79
%87 = load i8*, i8** %2
%88 = load i64, i64* %3
%89 = getelementptr inbounds i8, i8* %87, i64 %88
%90 = load i8, i8* %89
%91 = zext i8 %90 to i32
%92 = icmp sge i32 %91, 48
br i1 %92, label %93, label %100
93: ; preds = %86
%94 = load i8*, i8** %2
%95 = load i64, i64* %3
%96 = getelementptr inbounds i8, i8* %94, i64 %95
%97 = load i8, i8* %96
%98 = zext i8 %97 to i32
%99 = icmp sle i32 %98, 57
br label %100
100: ; preds = %93, %86, %79
%101 = phi i1 [ false, %86 ], [ false, %79 ], [ %99, %93 ]
br i1 %101, label %102, label %116
102: ; preds = %100
%103 = load i64, i64* %4
%104 = mul i64 %103, 10
store i64 %104, i64* %4
%105 = load i8*, i8** %2
%106 = load i64, i64* %3
%107 = getelementptr inbounds i8, i8* %105, i64 %106
%108 = load i8, i8* %107
%109 = zext i8 %108 to i32
%110 = sub nsw i32 %109, 48
%111 = sext i32 %110 to i64
%112 = load i64, i64* %4
%113 = add i64 %112, %111
store i64 %113, i64* %4
%114 = load i64, i64* %3
%115 = add nsw i64 %114, 1
store i64 %115, i64* %3
br label %79
116: ; preds = %100
%117 = load i64, i64* %4
%118 = load i32, i32* %5
%119 = sext i32 %118 to i64
%120 = mul i64 %117, %119
%121 = trunc i64 %120 to i32
ret i32 %121
}

LLVM IR (-O2):
define i32 @ft_atoi(i8* nocapture %0) {
br label %2
2: ; preds = %6, %1
%3 = phi i64 [ 0, %1 ], [ %7, %6 ]
%4 = getelementptr inbounds i8, i8* %0, i64 %3
%5 = load i8, i8* %4
switch i8 %5, label %14 [
i8 10, label %6
i8 9, label %6
i8 11, label %6
i8 32, label %6
i8 12, label %6
i8 13, label %6
i8 45, label %8
i8 43, label %9
]
6: ; preds = %2, %2, %2, %2, %2, %2
%7 = add nuw nsw i64 %3, 1
br label %2
8: ; preds = %2
br label %9
9: ; preds = %2, %8
%10 = phi i64 [ -1, %8 ], [ 1, %2 ]
%11 = add nuw nsw i64 %3, 1
%12 = getelementptr inbounds i8, i8* %0, i64 %11
%13 = load i8, i8* %12
br label %14
14: ; preds = %2, %9
%15 = phi i8 [ %13, %9 ], [ %5, %2 ]
%16 = phi i64 [ %10, %9 ], [ 1, %2 ]
%17 = phi i64 [ %11, %9 ], [ %3, %2 ]
%18 = add i8 %15, -48
%19 = icmp ult i8 %18, 10
br i1 %19, label %20, label %34
20: ; preds = %14, %20
%21 = phi i8 [ %31, %20 ], [ %15, %14 ]
%22 = phi i64 [ %28, %20 ], [ 0, %14 ]
%23 = phi i64 [ %29, %20 ], [ %17, %14 ]
%24 = zext i8 %21 to i64
%25 = mul i64 %22, 10
%26 = add nuw nsw i64 %24, 4294967248
%27 = and i64 %26, 4294967295
%28 = add i64 %27, %25
%29 = add nsw i64 %23, 1
%30 = getelementptr inbounds i8, i8* %0, i64 %29
%31 = load i8, i8* %30
%32 = add i8 %31, -48
%33 = icmp ult i8 %32, 10
br i1 %33, label %20, label %34
34: ; preds = %20, %14
%35 = phi i64 [ 0, %14 ], [ %28, %20 ]
%36 = mul i64 %35, %16
%37 = trunc i64 %36 to i32
ret i32 %37
}