void cvt_num_field(long int n, char *s) {
  int dp = 3;
  int d;
  int i = 0;
  if (n < 0) {
    s[i++] = '-';
    n = -n;
  } else {
    s[i++] = '+';
  }
  while (n > 9999) {
    n /= 10;
    dp--;
  }
  while (dp <= 0)
    dp += 3;
  dp = 4 - dp;
  for (d = 1000; d > 0; d /= 10) {
    if (dp-- == 0)
      s[i++] = '.';
    s[i++] = (n / d) + '0';
    n %= d;
  }
  return;
}


x86 assembly (clang, -O0):
<cvt_num_field>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x3,-0x14(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpq   $0x0,-0x8(%rbp)
jge    114a <cvt_num_field+0x4a>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movb   $0x2d,(%rax,%rcx,1)
xor    %eax,%eax
sub    -0x8(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1160 <cvt_num_field+0x60>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movb   $0x2b,(%rax,%rcx,1)
jmp    1165 <cvt_num_field+0x65>
cmpq   $0x270f,-0x8(%rbp)
jle    1193 <cvt_num_field+0x93>
mov    -0x8(%rbp),%rax
mov    $0xa,%ecx
cqto
idiv   %rcx
mov    %rax,-0x8(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    1165 <cvt_num_field+0x65>
jmp    1198 <cvt_num_field+0x98>
cmpl   $0x0,-0x14(%rbp)
jg     11b0 <cvt_num_field+0xb0>
mov    -0x14(%rbp),%eax
add    $0x3,%eax
mov    %eax,-0x14(%rbp)
jmp    1198 <cvt_num_field+0x98>
mov    $0x4,%eax
sub    -0x14(%rbp),%eax
mov    %eax,-0x14(%rbp)
movl   $0x3e8,-0x18(%rbp)
cmpl   $0x0,-0x18(%rbp)
jle    1242 <cvt_num_field+0x142>
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x14(%rbp)
cmp    $0x0,%eax
jne    11f6 <cvt_num_field+0xf6>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x1c(%rbp)
movslq %ecx,%rcx
movb   $0x2e,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
cqto
idiv   %rcx
add    $0x30,%rax
mov    %al,%dl
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x1c(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
movslq -0x18(%rbp),%rcx
mov    -0x8(%rbp),%rax
cqto
idiv   %rcx
mov    %rdx,-0x8(%rbp)
mov    -0x18(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,-0x18(%rbp)
jmp    11c2 <cvt_num_field+0xc2>
pop    %rbp
ret

x86 assembly (clang, -O2):
<cvt_num_field>:
test   %rdi,%rdi
js     110a <cvt_num_field+0xa>
movb   $0x2b,(%rsi)
jmp    1110 <cvt_num_field+0x10>
movb   $0x2d,(%rsi)
neg    %rdi
mov    $0x3,%ecx
cmp    $0x2710,%rdi
jb     114e <cvt_num_field+0x4e>
mov    $0x3,%ecx
movabs $0xcccccccccccccccd,%r9
cc cc cc
nopl   (%rax)
mov    %rdi,%rax
mul    %r9
mov    %rdx,%r8
shr    $0x3,%r8
add    $0xffffffff,%ecx
cmp    $0x1869f,%rdi
mov    %r8,%rdi
ja     1130 <cvt_num_field+0x30>
jmp    1151 <cvt_num_field+0x51>
mov    %rdi,%r8
cmp    $0x2,%ecx
mov    $0x1,%eax
cmovge %ecx,%eax
xor    %edx,%edx
sub    %ecx,%eax
setne  %dl
sub    %edx,%eax
mov    $0xaaaaaaab,%edi
imul   %rax,%rdi
shr    $0x21,%rdi
add    %edx,%edi
lea    (%rdi,%rdi,2),%edi
add    %ecx,%edi
cmp    $0x4,%edi
jne    11ac <cvt_num_field+0xac>
movb   $0x2e,0x1(%rsi)
mov    %r8,%rax
shr    $0x3,%rax
movabs $0x20c49ba5e353f7cf,%rcx
9b c4 20
mul    %rcx
shr    $0x4,%rdx
lea    0x30(%rdx),%eax
mov    %al,0x2(%rsi)
imul   $0x3e8,%rdx,%rax
sub    %rax,%r8
jmp    11dd <cvt_num_field+0xdd>
mov    %r8,%rax
shr    $0x3,%rax
movabs $0x20c49ba5e353f7cf,%rcx
9b c4 20
mul    %rcx
shr    $0x4,%rdx
lea    0x30(%rdx),%eax
mov    %al,0x1(%rsi)
imul   $0x3e8,%rdx,%rax
sub    %rax,%r8
cmp    $0x3,%edi
jne    122d <cvt_num_field+0x12d>
movb   $0x2e,0x2(%rsi)
movzwl %r8w,%eax
shr    $0x2,%eax
imul   $0x147b,%eax,%eax
shr    $0x11,%eax
imul   $0x64,%eax,%ecx
or     $0x30,%al
mov    %al,0x3(%rsi)
sub    %ecx,%r8d
movzwl %r8w,%eax
movzbl %al,%ecx
imul   $0xcd,%ecx,%edx
shr    $0xb,%edx
add    $0x30,%dl
mov    %dl,0x4(%rsi)
mov    $0x5,%ecx
movzbl %al,%edx
imul   $0xcd,%edx,%edx
shr    $0xa,%edx
and    $0xfffffffe,%edx
lea    (%rdx,%rdx,4),%edx
sub    %dl,%al
or     $0x30,%al
mov    %al,(%rsi,%rcx,1)
ret
movzwl %r8w,%eax
shr    $0x2,%eax
imul   $0x147b,%eax,%eax
shr    $0x11,%eax
imul   $0x64,%eax,%ecx
or     $0x30,%al
mov    %al,0x2(%rsi)
sub    %ecx,%r8d
movzwl %r8w,%eax
cmp    $0x2,%edi
jne    1257 <cvt_num_field+0x157>
movb   $0x2e,0x3(%rsi)
jmp    11fc <cvt_num_field+0xfc>
movzbl %al,%ecx
imul   $0xcd,%ecx,%ecx
shr    $0xb,%ecx
or     $0x30,%cl
mov    %cl,0x3(%rsi)
mov    $0x4,%ecx
mov    $0x2e,%dl
cmp    $0x1,%edi
je     120b <cvt_num_field+0x10b>
jmp    1213 <cvt_num_field+0x113>

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

LLVM IR (-O2):
define void @cvt_num_field(i64 %0, i8* nocapture writeonly %1) {
%3 = icmp slt i64 %0, 0
br i1 %3, label %4, label %6
4: ; preds = %2
store i8 45, i8* %1
%5 = sub nsw i64 0, %0
br label %7
6: ; preds = %2
store i8 43, i8* %1
br label %7
7: ; preds = %6, %4
%8 = phi i64 [ %5, %4 ], [ %0, %6 ]
%9 = icmp ugt i64 %8, 9999
br i1 %9, label %23, label %10
10: ; preds = %23, %7
%11 = phi i64 [ %8, %7 ], [ %26, %23 ]
%12 = phi i32 [ 3, %7 ], [ %27, %23 ]
%13 = call i32 @llvm.smax.i32(i32 %12, i32 1)
%14 = sub i32 %13, %12
%15 = icmp ne i32 %14, 0
%16 = zext i1 %15 to i32
%17 = sub i32 %14, %16
%18 = udiv i32 %17, 3
%19 = add nuw nsw i32 %18, %16
%20 = mul i32 %19, 3
%21 = add i32 %12, %20
%22 = icmp eq i32 %21, 4
br i1 %22, label %29, label %36
23: ; preds = %7, %23
%24 = phi i32 [ %27, %23 ], [ 3, %7 ]
%25 = phi i64 [ %26, %23 ], [ %8, %7 ]
%26 = udiv i64 %25, 10
%27 = add nsw i32 %24, -1
%28 = icmp ugt i64 %25, 99999
br i1 %28, label %23, label %10
29: ; preds = %10
%30 = getelementptr inbounds i8, i8* %1, i64 1
store i8 46, i8* %30
%31 = udiv i64 %11, 1000
%32 = trunc i64 %31 to i8
%33 = add i8 %32, 48
%34 = getelementptr inbounds i8, i8* %1, i64 2
store i8 %33, i8* %34
%35 = urem i64 %11, 1000
br label %45
36: ; preds = %10
%37 = udiv i64 %11, 1000
%38 = trunc i64 %37 to i8
%39 = add i8 %38, 48
%40 = getelementptr inbounds i8, i8* %1, i64 1
store i8 %39, i8* %40
%41 = urem i64 %11, 1000
%42 = icmp eq i32 %21, 3
br i1 %42, label %43, label %55
43: ; preds = %36
%44 = getelementptr inbounds i8, i8* %1, i64 2
store i8 46, i8* %44
br label %45
45: ; preds = %29, %43
%46 = phi i64 [ %35, %29 ], [ %41, %43 ]
%47 = trunc i64 %46 to i16
%48 = udiv i16 %47, 100
%49 = trunc i16 %48 to i8
%50 = or i8 %49, 48
%51 = getelementptr inbounds i8, i8* %1, i64 3
store i8 %50, i8* %51
%52 = trunc i64 %46 to i16
%53 = urem i16 %52, 100
%54 = zext i16 %53 to i64
br label %67
55: ; preds = %36
%56 = trunc i64 %41 to i16
%57 = udiv i16 %56, 100
%58 = trunc i16 %57 to i8
%59 = or i8 %58, 48
%60 = getelementptr inbounds i8, i8* %1, i64 2
store i8 %59, i8* %60
%61 = trunc i64 %41 to i16
%62 = urem i16 %61, 100
%63 = zext i16 %62 to i64
%64 = icmp eq i32 %21, 2
br i1 %64, label %65, label %72
65: ; preds = %55
%66 = getelementptr inbounds i8, i8* %1, i64 3
store i8 46, i8* %66
br label %67
67: ; preds = %45, %65
%68 = phi i64 [ %54, %45 ], [ %63, %65 ]
%69 = trunc i64 %68 to i8
%70 = udiv i8 %69, 10
%71 = add nuw nsw i8 %70, 48
br label %78
72: ; preds = %55
%73 = trunc i16 %62 to i8
%74 = udiv i8 %73, 10
%75 = or i8 %74, 48
%76 = getelementptr inbounds i8, i8* %1, i64 3
store i8 %75, i8* %76
%77 = icmp eq i32 %21, 1
br i1 %77, label %78, label %82
78: ; preds = %72, %67
%79 = phi i8 [ %71, %67 ], [ 46, %72 ]
%80 = phi i64 [ %68, %67 ], [ %63, %72 ]
%81 = getelementptr inbounds i8, i8* %1, i64 4
store i8 %79, i8* %81
br label %82
82: ; preds = %78, %72
%83 = phi i64 [ %63, %72 ], [ %80, %78 ]
%84 = phi i64 [ 4, %72 ], [ 5, %78 ]
%85 = trunc i64 %83 to i8
%86 = urem i8 %85, 10
%87 = or i8 %86, 48
%88 = getelementptr inbounds i8, i8* %1, i64 %84
store i8 %87, i8* %88
ret void
}