int ft_mini_atoi(char *str, int len) {
  int result;
  int i;
  int sign;
  i = 0;
  result = 0;
  sign = 1;
  while ((str[i] == ' ' || str[i] == '\n' || str[i] == '\t' || str[i] == '\f' ||
          str[i] == '\r' || str[i] == '\v' || str[i] == '\a' ||
          str[i] == '\\') &&
         i < len)
    i++;
  if (str[i] == '-' && i < len) {
    sign = -1;
    i++;
  }
  if (str[i] == '+' && i < len)
    i++;
  while (str[i] != '\0' && str[i] <= '9' && str[i] >= '0' && i < len) {
    result = result * 10 + str[i] - '0';
    i++;
  }
  return (result * sign);
}


x86 assembly (clang, -O0):
<ft_mini_atoi>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x10(%rbp)
movl   $0x1,-0x18(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x20,%eax
je     11cd <ft_mini_atoi+0xcd>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0xa,%eax
je     11cd <ft_mini_atoi+0xcd>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x9,%eax
je     11cd <ft_mini_atoi+0xcd>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0xc,%eax
je     11cd <ft_mini_atoi+0xcd>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0xd,%eax
je     11cd <ft_mini_atoi+0xcd>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0xb,%eax
je     11cd <ft_mini_atoi+0xcd>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x7,%eax
je     11cd <ft_mini_atoi+0xcd>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x5c,%ecx
mov    %al,-0x19(%rbp)
jne    11d9 <ft_mini_atoi+0xd9>
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
setl   %al
mov    %al,-0x19(%rbp)
mov    -0x19(%rbp),%al
test   $0x1,%al
jne    11e9 <ft_mini_atoi+0xe9>
jmp    11f7 <ft_mini_atoi+0xf7>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1120 <ft_mini_atoi+0x20>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    1228 <ft_mini_atoi+0x128>
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1228 <ft_mini_atoi+0x128>
movl   $0xffffffff,-0x18(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2b,%eax
jne    1252 <ft_mini_atoi+0x152>
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1252 <ft_mini_atoi+0x152>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1257 <ft_mini_atoi+0x157>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x1a(%rbp)
je     12b1 <ft_mini_atoi+0x1b1>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x39,%ecx
mov    %al,-0x1a(%rbp)
jg     12b1 <ft_mini_atoi+0x1b1>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0x1a(%rbp)
jl     12b1 <ft_mini_atoi+0x1b1>
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
setl   %al
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%al
test   $0x1,%al
jne    12c1 <ft_mini_atoi+0x1c1>
jmp    12e7 <ft_mini_atoi+0x1e7>
imul   $0xa,-0x10(%rbp),%eax
mov    -0x8(%rbp),%rcx
movslq -0x14(%rbp),%rdx
movsbl (%rcx,%rdx,1),%ecx
add    %ecx,%eax
sub    $0x30,%eax
mov    %eax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1257 <ft_mini_atoi+0x157>
mov    -0x10(%rbp),%eax
imul   -0x18(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ft_mini_atoi>:
push   %rbx
xor    %ecx,%ecx
test   %esi,%esi
mov    $0x0,%eax
cmovg  %esi,%eax
movabs $0x100003e80,%r8
nopw   0x0(%rax,%rax,1)
movzbl (%rdi,%rcx,1),%edx
cmp    $0x20,%rdx
ja     113b <ft_mini_atoi+0x3b>
bt     %rdx,%r8
jae    113b <ft_mini_atoi+0x3b>
cmp    %rcx,%rax
je     1142 <ft_mini_atoi+0x42>
add    $0x1,%rcx
jmp    1120 <ft_mini_atoi+0x20>
cmp    $0x5c,%dl
je     1130 <ft_mini_atoi+0x30>
mov    %ecx,%eax
cmp    $0x2d,%dl
sete   %cl
cmp    %esi,%eax
setl   %dl
and    %cl,%dl
movzbl %dl,%r8d
mov    %eax,%r9d
lea    (%r8,%r9,1),%rcx
cmpb   $0x2b,(%rdi,%rcx,1)
sete   %r10b
cmp    %esi,%ecx
setl   %dl
and    %r10b,%dl
movzbl %dl,%r10d
mov    %ecx,%ecx
lea    (%r10,%rcx,1),%r11
mov    (%rdi,%r11,1),%dl
lea    -0x30(%rdx),%ebx
xor    %ecx,%ecx
cmp    $0x9,%bl
ja     11d4 <ft_mini_atoi+0xd4>
cmp    %esi,%r11d
jge    11d4 <ft_mini_atoi+0xd4>
mov    %r8d,%ecx
mov    %r10d,%ebx
add    %rcx,%rbx
add    %r8d,%eax
add    %r10d,%eax
add    $0x1,%eax
add    %rbx,%r9
add    %r9,%rdi
add    $0x1,%rdi
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nop
movzbl %dl,%edx
lea    (%rcx,%rcx,4),%ecx
lea    (%rdx,%rcx,2),%ecx
add    $0xffffffd0,%ecx
movzbl (%rdi),%edx
lea    -0x30(%rdx),%ebx
cmp    $0x9,%bl
ja     11d4 <ft_mini_atoi+0xd4>
lea    0x1(%rax),%ebx
add    $0x1,%rdi
cmp    %esi,%eax
mov    %ebx,%eax
jl     11b0 <ft_mini_atoi+0xb0>
mov    %ecx,%eax
neg    %eax
test   %r8d,%r8d
cmove  %ecx,%eax
pop    %rbx
ret

LLVM IR (-O0):
define i32 @ft_mini_atoi(i8* %0, i32 %1) {
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
store i8* %0, i8** %3
store i32 %1, i32* %4
store i32 0, i32* %6
store i32 0, i32* %5
store i32 1, i32* %7
br label %8
8: ; preds = %78, %2
%9 = load i8*, i8** %3
%10 = load i32, i32* %6
%11 = sext i32 %10 to i64
%12 = getelementptr inbounds i8, i8* %9, i64 %11
%13 = load i8, i8* %12
%14 = sext i8 %13 to i32
%15 = icmp eq i32 %14, 32
br i1 %15, label %72, label %16
16: ; preds = %8
%17 = load i8*, i8** %3
%18 = load i32, i32* %6
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds i8, i8* %17, i64 %19
%21 = load i8, i8* %20
%22 = sext i8 %21 to i32
%23 = icmp eq i32 %22, 10
br i1 %23, label %72, label %24
24: ; preds = %16
%25 = load i8*, i8** %3
%26 = load i32, i32* %6
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds i8, i8* %25, i64 %27
%29 = load i8, i8* %28
%30 = sext i8 %29 to i32
%31 = icmp eq i32 %30, 9
br i1 %31, label %72, label %32
32: ; preds = %24
%33 = load i8*, i8** %3
%34 = load i32, i32* %6
%35 = sext i32 %34 to i64
%36 = getelementptr inbounds i8, i8* %33, i64 %35
%37 = load i8, i8* %36
%38 = sext i8 %37 to i32
%39 = icmp eq i32 %38, 12
br i1 %39, label %72, label %40
40: ; preds = %32
%41 = load i8*, i8** %3
%42 = load i32, i32* %6
%43 = sext i32 %42 to i64
%44 = getelementptr inbounds i8, i8* %41, i64 %43
%45 = load i8, i8* %44
%46 = sext i8 %45 to i32
%47 = icmp eq i32 %46, 13
br i1 %47, label %72, label %48
48: ; preds = %40
%49 = load i8*, i8** %3
%50 = load i32, i32* %6
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds i8, i8* %49, i64 %51
%53 = load i8, i8* %52
%54 = sext i8 %53 to i32
%55 = icmp eq i32 %54, 11
br i1 %55, label %72, label %56
56: ; preds = %48
%57 = load i8*, i8** %3
%58 = load i32, i32* %6
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds i8, i8* %57, i64 %59
%61 = load i8, i8* %60
%62 = sext i8 %61 to i32
%63 = icmp eq i32 %62, 7
br i1 %63, label %72, label %64
64: ; preds = %56
%65 = load i8*, i8** %3
%66 = load i32, i32* %6
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds i8, i8* %65, i64 %67
%69 = load i8, i8* %68
%70 = sext i8 %69 to i32
%71 = icmp eq i32 %70, 92
br i1 %71, label %72, label %76
72: ; preds = %64, %56, %48, %40, %32, %24, %16, %8
%73 = load i32, i32* %6
%74 = load i32, i32* %4
%75 = icmp slt i32 %73, %74
br label %76
76: ; preds = %72, %64
%77 = phi i1 [ false, %64 ], [ %75, %72 ]
br i1 %77, label %78, label %81
78: ; preds = %76
%79 = load i32, i32* %6
%80 = add nsw i32 %79, 1
store i32 %80, i32* %6
br label %8
81: ; preds = %76
%82 = load i8*, i8** %3
%83 = load i32, i32* %6
%84 = sext i32 %83 to i64
%85 = getelementptr inbounds i8, i8* %82, i64 %84
%86 = load i8, i8* %85
%87 = sext i8 %86 to i32
%88 = icmp eq i32 %87, 45
br i1 %88, label %89, label %96
89: ; preds = %81
%90 = load i32, i32* %6
%91 = load i32, i32* %4
%92 = icmp slt i32 %90, %91
br i1 %92, label %93, label %96
93: ; preds = %89
store i32 -1, i32* %7
%94 = load i32, i32* %6
%95 = add nsw i32 %94, 1
store i32 %95, i32* %6
br label %96
96: ; preds = %93, %89, %81
%97 = load i8*, i8** %3
%98 = load i32, i32* %6
%99 = sext i32 %98 to i64
%100 = getelementptr inbounds i8, i8* %97, i64 %99
%101 = load i8, i8* %100
%102 = sext i8 %101 to i32
%103 = icmp eq i32 %102, 43
br i1 %103, label %104, label %111
104: ; preds = %96
%105 = load i32, i32* %6
%106 = load i32, i32* %4
%107 = icmp slt i32 %105, %106
br i1 %107, label %108, label %111
108: ; preds = %104
%109 = load i32, i32* %6
%110 = add nsw i32 %109, 1
store i32 %110, i32* %6
br label %111
111: ; preds = %108, %104, %96
br label %112
112: ; preds = %142, %111
%113 = load i8*, i8** %3
%114 = load i32, i32* %6
%115 = sext i32 %114 to i64
%116 = getelementptr inbounds i8, i8* %113, i64 %115
%117 = load i8, i8* %116
%118 = sext i8 %117 to i32
%119 = icmp ne i32 %118, 0
br i1 %119, label %120, label %140
120: ; preds = %112
%121 = load i8*, i8** %3
%122 = load i32, i32* %6
%123 = sext i32 %122 to i64
%124 = getelementptr inbounds i8, i8* %121, i64 %123
%125 = load i8, i8* %124
%126 = sext i8 %125 to i32
%127 = icmp sle i32 %126, 57
br i1 %127, label %128, label %140
128: ; preds = %120
%129 = load i8*, i8** %3
%130 = load i32, i32* %6
%131 = sext i32 %130 to i64
%132 = getelementptr inbounds i8, i8* %129, i64 %131
%133 = load i8, i8* %132
%134 = sext i8 %133 to i32
%135 = icmp sge i32 %134, 48
br i1 %135, label %136, label %140
136: ; preds = %128
%137 = load i32, i32* %6
%138 = load i32, i32* %4
%139 = icmp slt i32 %137, %138
br label %140
140: ; preds = %136, %128, %120, %112
%141 = phi i1 [ false, %128 ], [ false, %120 ], [ false, %112 ], [ %139, %136 ]
br i1 %141, label %142, label %155
142: ; preds = %140
%143 = load i32, i32* %5
%144 = mul nsw i32 %143, 10
%145 = load i8*, i8** %3
%146 = load i32, i32* %6
%147 = sext i32 %146 to i64
%148 = getelementptr inbounds i8, i8* %145, i64 %147
%149 = load i8, i8* %148
%150 = sext i8 %149 to i32
%151 = add nsw i32 %144, %150
%152 = sub nsw i32 %151, 48
store i32 %152, i32* %5
%153 = load i32, i32* %6
%154 = add nsw i32 %153, 1
store i32 %154, i32* %6
br label %112
155: ; preds = %140
%156 = load i32, i32* %5
%157 = load i32, i32* %7
%158 = mul nsw i32 %156, %157
ret i32 %158
}

LLVM IR (-O2):
define i32 @ft_mini_atoi(i8* nocapture %0, i32 %1) {
%3 = call i32 @llvm.smax.i32(i32 %1, i32 0)
%4 = zext i32 %3 to i64
br label %5
5: ; preds = %11, %2
%6 = phi i64 [ %12, %11 ], [ 0, %2 ]
%7 = getelementptr inbounds i8, i8* %0, i64 %6
%8 = load i8, i8* %7
switch i8 %8, label %13 [
i8 32, label %9
i8 10, label %9
i8 9, label %9
i8 12, label %9
i8 13, label %9
i8 11, label %9
i8 7, label %9
i8 92, label %9
]
9: ; preds = %5, %5, %5, %5, %5, %5, %5, %5
%10 = icmp eq i64 %6, %4
br i1 %10, label %15, label %11
11: ; preds = %9
%12 = add nuw nsw i64 %6, 1
br label %5
13: ; preds = %5
%14 = trunc i64 %6 to i32
br label %15
15: ; preds = %9, %13
%16 = phi i32 [ %14, %13 ], [ %3, %9 ]
%17 = icmp eq i8 %8, 45
%18 = icmp slt i32 %16, %1
%19 = select i1 %17, i1 %18, i1 false
%20 = zext i1 %19 to i32
%21 = add nuw nsw i32 %16, %20
%22 = zext i32 %21 to i64
%23 = getelementptr inbounds i8, i8* %0, i64 %22
%24 = load i8, i8* %23
%25 = icmp eq i8 %24, 43
%26 = icmp slt i32 %21, %1
%27 = select i1 %25, i1 %26, i1 false
%28 = zext i1 %27 to i32
%29 = add nuw nsw i32 %21, %28
%30 = zext i32 %29 to i64
%31 = getelementptr inbounds i8, i8* %0, i64 %30
%32 = load i8, i8* %31
%33 = add i8 %32, -48
%34 = icmp ult i8 %33, 10
%35 = icmp slt i32 %29, %1
%36 = select i1 %34, i1 %35, i1 false
br i1 %36, label %37, label %59
37: ; preds = %15
%38 = zext i1 %19 to i64
%39 = zext i1 %27 to i64
%40 = add nuw nsw i64 %38, %39
%41 = zext i32 %16 to i64
%42 = add nuw nsw i64 %40, %41
br label %43
43: ; preds = %37, %43
%44 = phi i64 [ %42, %37 ], [ %51, %43 ]
%45 = phi i8 [ %32, %37 ], [ %53, %43 ]
%46 = phi i32 [ 0, %37 ], [ %50, %43 ]
%47 = zext i8 %45 to i32
%48 = mul nsw i32 %46, 10
%49 = add i32 %48, -48
%50 = add i32 %49, %47
%51 = add nuw nsw i64 %44, 1
%52 = getelementptr inbounds i8, i8* %0, i64 %51
%53 = load i8, i8* %52
%54 = add i8 %53, -48
%55 = icmp ult i8 %54, 10
%56 = trunc i64 %51 to i32
%57 = icmp slt i32 %56, %1
%58 = select i1 %55, i1 %57, i1 false
br i1 %58, label %43, label %59
59: ; preds = %43, %15
%60 = phi i32 [ 0, %15 ], [ %50, %43 ]
%61 = sub nsw i32 0, %60
%62 = select i1 %19, i32 %61, i32 %60
ret i32 %62
}