void ft_convert(long int n, char *str, int i, int sys) {
  str += i;
  while (i > 0) {
    *str = n % sys + '0';
    n /= sys;
    str--;
    i--;
  }
  *str = n % sys + '0';
}


x86 assembly (clang, -O0):
<ft_convert>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    -0x14(%rbp),%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
cmpl   $0x0,-0x14(%rbp)
jle    1171 <ft_convert+0x71>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
cqto
idiv   %rcx
add    $0x30,%rdx
mov    %dl,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
movslq -0x18(%rbp),%rcx
mov    -0x8(%rbp),%rax
cqto
idiv   %rcx
mov    %rax,-0x8(%rbp)
mov    -0x10(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x10(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    1123 <ft_convert+0x23>
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
cqto
idiv   %rcx
add    $0x30,%rdx
mov    %dl,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<ft_convert>:
mov    %edx,%r8d
mov    %rdi,%rax
movslq %edx,%rdx
add    %rdx,%rsi
movslq %ecx,%r9
test   %edx,%edx
jle    114e <ft_convert+0x4e>
test   $0x1,%r8b
jne    1124 <ft_convert+0x24>
mov    %r8d,%edi
cmp    $0x1,%r8d
je     114e <ft_convert+0x4e>
jmp    116b <ft_convert+0x6b>
mov    %rax,%rdx
or     %r9,%rdx
shr    $0x20,%rdx
je     1137 <ft_convert+0x37>
cqto
idiv   %r9
jmp    113b <ft_convert+0x3b>
xor    %edx,%edx
div    %ecx
add    $0x30,%dl
mov    %dl,(%rsi)
add    $0xffffffffffffffff,%rsi
lea    -0x1(%r8),%edi
cmp    $0x1,%r8d
jne    116b <ft_convert+0x6b>
mov    %rax,%rdx
or     %r9,%rdx
shr    $0x20,%rdx
je     1161 <ft_convert+0x61>
cqto
idiv   %r9
jmp    1165 <ft_convert+0x65>
xor    %edx,%edx
div    %ecx
add    $0x30,%dl
mov    %dl,(%rsi)
ret
add    $0xffffffff,%edi
jmp    1184 <ft_convert+0x84>
cqto
idiv   %r9
add    $0x30,%dl
mov    %dl,-0x1(%rsi)
add    $0xfffffffffffffffe,%rsi
add    $0xfffffffe,%edi
jae    114e <ft_convert+0x4e>
mov    %rax,%rdx
or     %r9,%rdx
shr    $0x20,%rdx
je     11a0 <ft_convert+0xa0>
cqto
idiv   %r9
jmp    11a4 <ft_convert+0xa4>
nopw   0x0(%rax,%rax,1)
xor    %edx,%edx
div    %ecx
add    $0x30,%dl
mov    %dl,(%rsi)
mov    %rax,%rdx
or     %r9,%rdx
shr    $0x20,%rdx
jne    1170 <ft_convert+0x70>
xor    %edx,%edx
div    %ecx
jmp    1175 <ft_convert+0x75>

LLVM IR (-O0):
define void @ft_convert(i64 %0, i8* %1, i32 %2, i32 %3) {
%5 = alloca i64
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
store i64 %0, i64* %5
store i8* %1, i8** %6
store i32 %2, i32* %7
store i32 %3, i32* %8
%9 = load i32, i32* %7
%10 = load i8*, i8** %6
%11 = sext i32 %9 to i64
%12 = getelementptr inbounds i8, i8* %10, i64 %11
store i8* %12, i8** %6
br label %13
13: ; preds = %16, %4
%14 = load i32, i32* %7
%15 = icmp sgt i32 %14, 0
br i1 %15, label %16, label %32
16: ; preds = %13
%17 = load i64, i64* %5
%18 = load i32, i32* %8
%19 = sext i32 %18 to i64
%20 = srem i64 %17, %19
%21 = add nsw i64 %20, 48
%22 = trunc i64 %21 to i8
%23 = load i8*, i8** %6
store i8 %22, i8* %23
%24 = load i32, i32* %8
%25 = sext i32 %24 to i64
%26 = load i64, i64* %5
%27 = sdiv i64 %26, %25
store i64 %27, i64* %5
%28 = load i8*, i8** %6
%29 = getelementptr inbounds i8, i8* %28, i32 -1
store i8* %29, i8** %6
%30 = load i32, i32* %7
%31 = add nsw i32 %30, -1
store i32 %31, i32* %7
br label %13
32: ; preds = %13
%33 = load i64, i64* %5
%34 = load i32, i32* %8
%35 = sext i32 %34 to i64
%36 = srem i64 %33, %35
%37 = add nsw i64 %36, 48
%38 = trunc i64 %37 to i8
%39 = load i8*, i8** %6
store i8 %38, i8* %39
ret void
}

LLVM IR (-O2):
define void @ft_convert(i64 %0, i8* nocapture writeonly %1, i32 %2, i32 %3) {
%5 = sext i32 %2 to i64
%6 = getelementptr inbounds i8, i8* %1, i64 %5
%7 = icmp sgt i32 %2, 0
%8 = sext i32 %3 to i64
br i1 %7, label %9, label %43
9: ; preds = %4
%10 = and i32 %2, 1
%11 = icmp eq i32 %10, 0
br i1 %11, label %19, label %12
12: ; preds = %9
%13 = srem i64 %0, %8
%14 = trunc i64 %13 to i8
%15 = add i8 %14, 48
store i8 %15, i8* %6
%16 = sdiv i64 %0, %8
%17 = getelementptr inbounds i8, i8* %6, i64 -1
%18 = add nsw i32 %2, -1
br label %19
19: ; preds = %12, %9
%20 = phi i64 [ %0, %9 ], [ %16, %12 ]
%21 = phi i32 [ %2, %9 ], [ %18, %12 ]
%22 = phi i8* [ %6, %9 ], [ %17, %12 ]
%23 = phi i64 [ undef, %9 ], [ %16, %12 ]
%24 = phi i8* [ undef, %9 ], [ %17, %12 ]
%25 = icmp eq i32 %2, 1
br i1 %25, label %43, label %26
26: ; preds = %19, %26
%27 = phi i64 [ %38, %26 ], [ %20, %19 ]
%28 = phi i32 [ %40, %26 ], [ %21, %19 ]
%29 = phi i8* [ %39, %26 ], [ %22, %19 ]
%30 = srem i64 %27, %8
%31 = trunc i64 %30 to i8
%32 = add i8 %31, 48
store i8 %32, i8* %29
%33 = sdiv i64 %27, %8
%34 = getelementptr inbounds i8, i8* %29, i64 -1
%35 = srem i64 %33, %8
%36 = trunc i64 %35 to i8
%37 = add i8 %36, 48
store i8 %37, i8* %34
%38 = sdiv i64 %33, %8
%39 = getelementptr inbounds i8, i8* %29, i64 -2
%40 = add nsw i32 %28, -2
%41 = add i32 %28, -3
%42 = icmp ult i32 %41, -2
br i1 %42, label %26, label %43
43: ; preds = %19, %26, %4
%44 = phi i8* [ %6, %4 ], [ %24, %19 ], [ %39, %26 ]
%45 = phi i64 [ %0, %4 ], [ %23, %19 ], [ %38, %26 ]
%46 = srem i64 %45, %8
%47 = trunc i64 %46 to i8
%48 = add i8 %47, 48
store i8 %48, i8* %44
ret void
}