#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int strlen(char const *);
void fmt2(char *dst, char const *src) {
  int l = strlen(src);
  int i, j;
  if (l >= 3) {
    for (i = l - 2; i > 0; i--) {
      *dst++ = *src++;
      if (i % 3 == 1 && i > 1) {
        *dst++ = ',';
      }
    }
  } else
    *dst++ = '0';
  *dst++ = '.';
  *dst++ = l < 2 ? '0' : *src++;
  *dst++ = l < 1 ? '0' : *src++;
  *dst = '\0';
}


x86 assembly (clang, -O0):
<fmt2>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x14(%rbp)
cmpl   $0x3,-0x14(%rbp)
jl     11b3 <fmt2+0xa3>
mov    -0x14(%rbp),%eax
sub    $0x2,%eax
mov    %eax,-0x18(%rbp)
cmpl   $0x0,-0x18(%rbp)
jle    11ae <fmt2+0x9e>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
mov    -0x18(%rbp),%eax
mov    $0x3,%ecx
cltd
idiv   %ecx
cmp    $0x1,%edx
jne    119b <fmt2+0x8b>
cmpl   $0x1,-0x18(%rbp)
jle    119b <fmt2+0x8b>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movb   $0x2c,(%rax)
jmp    11a0 <fmt2+0x90>
mov    -0x18(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x18(%rbp)
jmp    113f <fmt2+0x2f>
jmp    11c5 <fmt2+0xb5>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movb   $0x30,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movb   $0x2e,(%rax)
cmpl   $0x2,-0x14(%rbp)
jge    11ee <fmt2+0xde>
mov    $0x30,%eax
mov    %eax,-0x20(%rbp)
jmp    1203 <fmt2+0xf3>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
cmpl   $0x1,-0x14(%rbp)
jge    1230 <fmt2+0x120>
mov    $0x30,%eax
mov    %eax,-0x24(%rbp)
jmp    1245 <fmt2+0x135>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
mov    -0x8(%rbp),%rax
movb   $0x0,(%rax)
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fmt2>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
mov    %rsi,%r14
mov    %rdi,%r15
mov    %rsi,%rdi
call   1030 <strlen@plt>
cmp    $0x3,%eax
jl     113c <fmt2+0x2c>
lea    -0x2(%rax),%r11d
test   $0x1,%al
jne    1149 <fmt2+0x39>
cmp    $0x3,%eax
jne    1195 <fmt2+0x85>
jmp    1242 <fmt2+0x132>
movb   $0x30,(%r15)
add    $0x1,%r15
jmp    123f <fmt2+0x12f>
mov    (%r14),%bl
lea    0x1(%r15),%rdx
mov    %bl,(%r15)
cmp    $0x1,%r11d
je     1181 <fmt2+0x71>
mov    %r11d,%esi
mov    $0xaaaaaaab,%edi
imul   %rsi,%rdi
shr    $0x21,%rdi
lea    (%rdi,%rdi,2),%esi
sub    %esi,%r11d
cmp    $0x1,%r11d
jne    1181 <fmt2+0x71>
movb   $0x2c,0x1(%r15)
add    $0x2,%r15
mov    %r15,%rdx
add    $0x1,%r14
lea    -0x3(%rax),%r11d
mov    %rdx,%r15
cmp    $0x3,%eax
je     1242 <fmt2+0x132>
lea    -0x2(%r11),%r8d
lea    -0x1(%r11),%r10d
mov    %r11d,%edi
add    $0xffffffffffffffff,%rdi
xor    %edx,%edx
mov    $0xaaaaaaab,%r9d
mov    %r10d,%esi
jmp    11d4 <fmt2+0xc4>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
lea    -0x2(%r11),%ecx
add    $0xfffffffe,%esi
add    $0x2,%rdx
cmp    $0x2,%r11d
mov    %ecx,%r11d
jle    123c <fmt2+0x12c>
movzbl (%r14,%rdx,1),%ecx
lea    0x1(%r15),%rbx
mov    %cl,(%r15)
cmp    %edx,%edi
je     1207 <fmt2+0xf7>
mov    %r11d,%ecx
imul   %r9,%rcx
shr    $0x21,%rcx
lea    (%rcx,%rcx,2),%ecx
mov    %r10d,%ebp
sub    %ecx,%ebp
cmp    %edx,%ebp
jne    1207 <fmt2+0xf7>
movb   $0x2c,0x1(%r15)
add    $0x2,%r15
mov    %r15,%rbx
movzbl 0x1(%r14,%rdx,1),%ecx
lea    0x1(%rbx),%r15
mov    %cl,(%rbx)
cmp    $0x2,%r11d
je     11c0 <fmt2+0xb0>
mov    %esi,%ecx
imul   %r9,%rcx
shr    $0x21,%rcx
lea    (%rcx,%rcx,2),%ecx
mov    %r8d,%ebp
sub    %ecx,%ebp
cmp    %edx,%ebp
jne    11c0 <fmt2+0xb0>
movb   $0x2c,0x1(%rbx)
add    $0x2,%rbx
mov    %rbx,%r15
jmp    11c0 <fmt2+0xb0>
add    %rdx,%r14
mov    %r15,%rdx
movb   $0x2e,(%rdx)
cmp    $0x2,%eax
jge    1257 <fmt2+0x147>
movb   $0x30,0x1(%rdx)
mov    $0x30,%cl
cmp    $0x1,%eax
je     1261 <fmt2+0x151>
jmp    1264 <fmt2+0x154>
mov    (%r14),%al
add    $0x1,%r14
mov    %al,0x1(%rdx)
mov    (%r14),%cl
mov    %cl,0x2(%rdx)
movb   $0x0,0x3(%rdx)
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @fmt2(i8* %0, i8* %1) {
%3 = alloca i8*
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
store i8* %0, i8** %3
store i8* %1, i8** %4
%8 = load i8*, i8** %4
%9 = call i32 @strlen(i8* %8)
store i32 %9, i32* %5
%10 = load i32, i32* %5
%11 = icmp sge i32 %10, 3
br i1 %11, label %12, label %38
12: ; preds = %2
%13 = load i32, i32* %5
%14 = sub nsw i32 %13, 2
store i32 %14, i32* %6
br label %15
15: ; preds = %34, %12
%16 = load i32, i32* %6
%17 = icmp sgt i32 %16, 0
br i1 %17, label %18, label %37
18: ; preds = %15
%19 = load i8*, i8** %4
%20 = getelementptr inbounds i8, i8* %19, i32 1
store i8* %20, i8** %4
%21 = load i8, i8* %19
%22 = load i8*, i8** %3
%23 = getelementptr inbounds i8, i8* %22, i32 1
store i8* %23, i8** %3
store i8 %21, i8* %22
%24 = load i32, i32* %6
%25 = srem i32 %24, 3
%26 = icmp eq i32 %25, 1
br i1 %26, label %27, label %33
27: ; preds = %18
%28 = load i32, i32* %6
%29 = icmp sgt i32 %28, 1
br i1 %29, label %30, label %33
30: ; preds = %27
%31 = load i8*, i8** %3
%32 = getelementptr inbounds i8, i8* %31, i32 1
store i8* %32, i8** %3
store i8 44, i8* %31
br label %33
33: ; preds = %30, %27, %18
br label %34
34: ; preds = %33
%35 = load i32, i32* %6
%36 = add nsw i32 %35, -1
store i32 %36, i32* %6
br label %15
37: ; preds = %15
br label %41
38: ; preds = %2
%39 = load i8*, i8** %3
%40 = getelementptr inbounds i8, i8* %39, i32 1
store i8* %40, i8** %3
store i8 48, i8* %39
br label %41
41: ; preds = %38, %37
%42 = load i8*, i8** %3
%43 = getelementptr inbounds i8, i8* %42, i32 1
store i8* %43, i8** %3
store i8 46, i8* %42
%44 = load i32, i32* %5
%45 = icmp slt i32 %44, 2
br i1 %45, label %46, label %47
46: ; preds = %41
br label %52
47: ; preds = %41
%48 = load i8*, i8** %4
%49 = getelementptr inbounds i8, i8* %48, i32 1
store i8* %49, i8** %4
%50 = load i8, i8* %48
%51 = sext i8 %50 to i32
br label %52
52: ; preds = %47, %46
%53 = phi i32 [ 48, %46 ], [ %51, %47 ]
%54 = trunc i32 %53 to i8
%55 = load i8*, i8** %3
%56 = getelementptr inbounds i8, i8* %55, i32 1
store i8* %56, i8** %3
store i8 %54, i8* %55
%57 = load i32, i32* %5
%58 = icmp slt i32 %57, 1
br i1 %58, label %59, label %60
59: ; preds = %52
br label %65
60: ; preds = %52
%61 = load i8*, i8** %4
%62 = getelementptr inbounds i8, i8* %61, i32 1
store i8* %62, i8** %4
%63 = load i8, i8* %61
%64 = sext i8 %63 to i32
br label %65
65: ; preds = %60, %59
%66 = phi i32 [ 48, %59 ], [ %64, %60 ]
%67 = trunc i32 %66 to i8
%68 = load i8*, i8** %3
%69 = getelementptr inbounds i8, i8* %68, i32 1
store i8* %69, i8** %3
store i8 %67, i8* %68
%70 = load i8*, i8** %3
store i8 0, i8* %70
ret void
}

LLVM IR (-O2):
define void @fmt2(i8* nocapture writeonly %0, i8* %1) {
%3 = tail call i32 @strlen(i8* %1)
%4 = icmp sgt i32 %3, 2
br i1 %4, label %5, label %58
5: ; preds = %2
%6 = add i32 %3, -2
%7 = and i32 %3, 1
%8 = icmp eq i32 %7, 0
br i1 %8, label %22, label %9
9: ; preds = %5
%10 = getelementptr inbounds i8, i8* %1, i64 1
%11 = load i8, i8* %1
%12 = getelementptr inbounds i8, i8* %0, i64 1
store i8 %11, i8* %0
%13 = urem i32 %6, 3
%14 = icmp eq i32 %13, 1
%15 = icmp ne i32 %6, 1
%16 = and i1 %15, %14
br i1 %16, label %17, label %19
17: ; preds = %9
%18 = getelementptr inbounds i8, i8* %0, i64 2
store i8 44, i8* %12
br label %19
19: ; preds = %17, %9
%20 = phi i8* [ %18, %17 ], [ %12, %9 ]
%21 = add i32 %3, -3
br label %22
22: ; preds = %19, %5
%23 = phi i8* [ %0, %5 ], [ %20, %19 ]
%24 = phi i32 [ %6, %5 ], [ %21, %19 ]
%25 = phi i8* [ %1, %5 ], [ %10, %19 ]
%26 = phi i8* [ undef, %5 ], [ %20, %19 ]
%27 = phi i8* [ undef, %5 ], [ %10, %19 ]
%28 = icmp eq i32 %3, 3
br i1 %28, label %60, label %29
29: ; preds = %22, %54
%30 = phi i8* [ %55, %54 ], [ %23, %22 ]
%31 = phi i32 [ %56, %54 ], [ %24, %22 ]
%32 = phi i8* [ %45, %54 ], [ %25, %22 ]
%33 = getelementptr inbounds i8, i8* %32, i64 1
%34 = load i8, i8* %32
%35 = getelementptr inbounds i8, i8* %30, i64 1
store i8 %34, i8* %30
%36 = urem i32 %31, 3
%37 = icmp eq i32 %36, 1
%38 = icmp ne i32 %31, 1
%39 = and i1 %38, %37
br i1 %39, label %40, label %42
40: ; preds = %29
%41 = getelementptr inbounds i8, i8* %30, i64 2
store i8 44, i8* %35
br label %42
42: ; preds = %29, %40
%43 = phi i8* [ %41, %40 ], [ %35, %29 ]
%44 = add nsw i32 %31, -1
%45 = getelementptr inbounds i8, i8* %32, i64 2
%46 = load i8, i8* %33
%47 = getelementptr inbounds i8, i8* %43, i64 1
store i8 %46, i8* %43
%48 = urem i32 %44, 3
%49 = icmp eq i32 %48, 1
%50 = icmp ne i32 %44, 1
%51 = and i1 %50, %49
br i1 %51, label %52, label %54
52: ; preds = %42
%53 = getelementptr inbounds i8, i8* %43, i64 2
store i8 44, i8* %47
br label %54
54: ; preds = %52, %42
%55 = phi i8* [ %53, %52 ], [ %47, %42 ]
%56 = add nsw i32 %31, -2
%57 = icmp sgt i32 %31, 2
br i1 %57, label %29, label %60
58: ; preds = %2
%59 = getelementptr inbounds i8, i8* %0, i64 1
store i8 48, i8* %0
br label %60
60: ; preds = %22, %54, %58
%61 = phi i8* [ %1, %58 ], [ %27, %22 ], [ %45, %54 ]
%62 = phi i8* [ %59, %58 ], [ %26, %22 ], [ %55, %54 ]
%63 = getelementptr inbounds i8, i8* %62, i64 1
store i8 46, i8* %62
%64 = icmp slt i32 %3, 2
br i1 %64, label %68, label %65
65: ; preds = %60
%66 = getelementptr inbounds i8, i8* %61, i64 1
%67 = load i8, i8* %61
store i8 %67, i8* %63
br label %70
68: ; preds = %60
store i8 48, i8* %63
%69 = icmp eq i32 %3, 1
br i1 %69, label %70, label %73
70: ; preds = %65, %68
%71 = phi i8* [ %66, %65 ], [ %61, %68 ]
%72 = load i8, i8* %71
br label %73
73: ; preds = %68, %70
%74 = phi i8 [ %72, %70 ], [ 48, %68 ]
%75 = getelementptr inbounds i8, i8* %62, i64 2
%76 = getelementptr inbounds i8, i8* %62, i64 3
store i8 %74, i8* %75
store i8 0, i8* %76
ret void
}