void WriteValue(str, fmt, val, expv, logFlag) char *str;
char *fmt;
double val;
int expv;
int logFlag;
{
  int idx;
  if (logFlag) {
    if (val == floor(val)) {
      if (strcmp(fmt, "%.2f") == 0)
        fmt = "%.0e";
      val = pow(10.0, val);
    } else {
      if (strcmp(fmt, "%.2f") == 0)
        fmt = "%.2g";
      val = pow(10.0, val - floor(val));
    }
  } else {
    if (expv < 0) {
      for (idx = expv; idx < 0; idx++) {
        val *= 10.0;
      }
    } else {
      for (idx = 0; idx < expv; idx++) {
        val /= 10.0;
      }
    }
  }
  if (strchr(fmt, 'd') || strchr(fmt, 'x'))
    (void)sprintf(str, fmt, (int)val);
  else
    (void)sprintf(str, fmt, val);
}


x86 assembly (clang, -O0):
<WriteValue>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    %ecx,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
je     1239 <WriteValue+0xe9>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x18(%rbp),%xmm0
call   1070 <floor@plt>
movaps %xmm0,%xmm1
movsd  -0x30(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jne    11e1 <WriteValue+0x91>
jp     11e1 <WriteValue+0x91>
mov    -0x10(%rbp),%rdi
lea    0xe5c(%rip),%rsi
call   1040 <strcmp@plt>
cmp    $0x0,%eax
jne    11c5 <WriteValue+0x75>
lea    0xe4c(%rip),%rax
mov    %rax,-0x10(%rbp)
movsd  -0x18(%rbp),%xmm1
movsd  0xe2e(%rip),%xmm0
call   1050 <pow@plt>
movsd  %xmm0,-0x18(%rbp)
jmp    1234 <WriteValue+0xe4>
mov    -0x10(%rbp),%rdi
lea    0xe1c(%rip),%rsi
call   1040 <strcmp@plt>
cmp    $0x0,%eax
jne    1205 <WriteValue+0xb5>
lea    0xe11(%rip),%rax
mov    %rax,-0x10(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x18(%rbp),%xmm0
call   1070 <floor@plt>
movsd  -0x38(%rbp),%xmm1
subsd  %xmm0,%xmm1
movsd  0xdd6(%rip),%xmm0
call   1050 <pow@plt>
movsd  %xmm0,-0x18(%rbp)
jmp    12b9 <WriteValue+0x169>
cmpl   $0x0,-0x1c(%rbp)
jge    1278 <WriteValue+0x128>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jge    1273 <WriteValue+0x123>
movsd  0xda5(%rip),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1249 <WriteValue+0xf9>
jmp    12b4 <WriteValue+0x164>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    12af <WriteValue+0x15f>
movsd  -0x18(%rbp),%xmm0
movsd  0xd68(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    127f <WriteValue+0x12f>
jmp    12b4 <WriteValue+0x164>
jmp    12b9 <WriteValue+0x169>
mov    -0x10(%rbp),%rdi
mov    $0x64,%esi
call   1030 <strchr@plt>
cmp    $0x0,%rax
jne    12e9 <WriteValue+0x199>
mov    -0x10(%rbp),%rdi
mov    $0x78,%esi
call   1030 <strchr@plt>
cmp    $0x0,%rax
je     1302 <WriteValue+0x1b2>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
cvttsd2si -0x18(%rbp),%edx
mov    $0x0,%al
call   1060 <sprintf@plt>
jmp    1316 <WriteValue+0x1c6>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
movsd  -0x18(%rbp),%xmm0
mov    $0x1,%al
call   1060 <sprintf@plt>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<WriteValue>:
push   %r15
push   %r14
push   %rbx
sub    $0x10,%rsp
mov    %rsi,%r15
mov    %rdi,%r14
test   %ecx,%ecx
je     11d7 <WriteValue+0x87>
movsd  %xmm0,(%rsp)
call   1070 <floor@plt>
movsd  %xmm0,0x8(%rsp)
lea    0xe8e(%rip),%rsi
mov    %r15,%rdi
call   1040 <strcmp@plt>
movsd  0x8(%rsp),%xmm0
movsd  (%rsp),%xmm1
test   %eax,%eax
lea    0xe77(%rip),%rbx
cmovne %r15,%rbx
lea    0xe71(%rip),%rax
cmovne %r15,%rax
ucomisd %xmm1,%xmm0
jne    11b1 <WriteValue+0x61>
jp     11b1 <WriteValue+0x61>
xorpd  %xmm0,%xmm0
subsd  %xmm0,%xmm1
cmovne %rax,%rbx
cmovp  %rax,%rbx
movsd  0xe3b(%rip),%xmm0
call   1050 <pow@plt>
movsd  %xmm0,(%rsp)
mov    %rbx,%r15
jmp    12aa <WriteValue+0x15a>
test   %edx,%edx
js     123b <WriteValue+0xeb>
je     12a5 <WriteValue+0x155>
lea    -0x1(%rdx),%ecx
mov    %edx,%eax
and    $0x3,%eax
cmp    $0x3,%ecx
jb     1215 <WriteValue+0xc5>
and    $0xfffffffc,%edx
movsd  0xe07(%rip),%xmm1
nopl   0x0(%rax)
divsd  %xmm1,%xmm0
divsd  %xmm1,%xmm0
divsd  %xmm1,%xmm0
divsd  %xmm1,%xmm0
add    $0xfffffffc,%edx
jne    1200 <WriteValue+0xb0>
test   %eax,%eax
je     12a5 <WriteValue+0x155>
movsd  0xddb(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nop
divsd  %xmm1,%xmm0
add    $0xffffffff,%eax
jne    1230 <WriteValue+0xe0>
jmp    12a5 <WriteValue+0x155>
mov    %edx,%eax
neg    %eax
and    $0x7,%eax
je     1266 <WriteValue+0x116>
neg    %eax
xor    %ecx,%ecx
movsd  0xdb0(%rip),%xmm1
mulsd  %xmm1,%xmm0
add    $0xffffffff,%ecx
cmp    %ecx,%eax
jne    1250 <WriteValue+0x100>
mov    %edx,%eax
sub    %ecx,%eax
cmp    $0xfffffff8,%edx
jbe    126d <WriteValue+0x11d>
jmp    12a5 <WriteValue+0x155>
mov    %edx,%eax
cmp    $0xfffffff8,%edx
ja     12a5 <WriteValue+0x155>
movsd  0xd8b(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nop
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
add    $0x8,%eax
jne    1280 <WriteValue+0x130>
movsd  %xmm0,(%rsp)
mov    %r15,%rdi
mov    $0x64,%esi
call   1030 <strchr@plt>
test   %rax,%rax
jne    12ce <WriteValue+0x17e>
mov    %r15,%rdi
mov    $0x78,%esi
call   1030 <strchr@plt>
test   %rax,%rax
je     12e9 <WriteValue+0x199>
cvttsd2si (%rsp),%edx
mov    %r14,%rdi
mov    %r15,%rsi
xor    %eax,%eax
add    $0x10,%rsp
pop    %rbx
pop    %r14
pop    %r15
jmp    1060 <sprintf@plt>
mov    %r14,%rdi
mov    %r15,%rsi
movsd  (%rsp),%xmm0
mov    $0x1,%al
add    $0x10,%rsp
pop    %rbx
pop    %r14
pop    %r15
jmp    1060 <sprintf@plt>

LLVM IR (-O0):
@.str = [5 x i8] c"%.2f\00"
@.str.1 = [5 x i8] c"%.0e\00"
@.str.2 = [5 x i8] c"%.2g\00"
define void @WriteValue(i8* %0, i8* %1, double %2, i32 %3, i32 %4) {
%6 = alloca i8*
%7 = alloca i8*
%8 = alloca double
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
store i8* %0, i8** %6
store i8* %1, i8** %7
store double %2, double* %8
store i32 %3, i32* %9
store i32 %4, i32* %10
%12 = load i32, i32* %10
%13 = icmp ne i32 %12, 0
br i1 %13, label %14, label %39
14: ; preds = %5
%15 = load double, double* %8
%16 = load double, double* %8
%17 = call double @llvm.floor.f64(double %16)
%18 = fcmp oeq double %15, %17
br i1 %18, label %19, label %27
19: ; preds = %14
%20 = load i8*, i8** %7
%21 = call i32 @strcmp(i8* %20, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0))
%22 = icmp eq i32 %21, 0
br i1 %22, label %23, label %24
23: ; preds = %19
store i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i64 0, i64 0), i8** %7
br label %24
24: ; preds = %23, %19
%25 = load double, double* %8
%26 = call double @pow(double 1.000000e+01, double %25)
store double %26, double* %8
br label %38
27: ; preds = %14
%28 = load i8*, i8** %7
%29 = call i32 @strcmp(i8* %28, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0))
%30 = icmp eq i32 %29, 0
br i1 %30, label %31, label %32
31: ; preds = %27
store i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0), i8** %7
br label %32
32: ; preds = %31, %27
%33 = load double, double* %8
%34 = load double, double* %8
%35 = call double @llvm.floor.f64(double %34)
%36 = fsub double %33, %35
%37 = call double @pow(double 1.000000e+01, double %36)
store double %37, double* %8
br label %38
38: ; preds = %32, %24
br label %67
39: ; preds = %5
%40 = load i32, i32* %9
%41 = icmp slt i32 %40, 0
br i1 %41, label %42, label %54
42: ; preds = %39
%43 = load i32, i32* %9
store i32 %43, i32* %11
br label %44
44: ; preds = %50, %42
%45 = load i32, i32* %11
%46 = icmp slt i32 %45, 0
br i1 %46, label %47, label %53
47: ; preds = %44
%48 = load double, double* %8
%49 = fmul double %48, 1.000000e+01
store double %49, double* %8
br label %50
50: ; preds = %47
%51 = load i32, i32* %11
%52 = add nsw i32 %51, 1
store i32 %52, i32* %11
br label %44
53: ; preds = %44
br label %66
54: ; preds = %39
store i32 0, i32* %11
br label %55
55: ; preds = %62, %54
%56 = load i32, i32* %11
%57 = load i32, i32* %9
%58 = icmp slt i32 %56, %57
br i1 %58, label %59, label %65
59: ; preds = %55
%60 = load double, double* %8
%61 = fdiv double %60, 1.000000e+01
store double %61, double* %8
br label %62
62: ; preds = %59
%63 = load i32, i32* %11
%64 = add nsw i32 %63, 1
store i32 %64, i32* %11
br label %55
65: ; preds = %55
br label %66
66: ; preds = %65, %53
br label %67
67: ; preds = %66, %38
%68 = load i8*, i8** %7
%69 = call i8* @strchr(i8* %68, i32 100)
%70 = icmp ne i8* %69, null
br i1 %70, label %75, label %71
71: ; preds = %67
%72 = load i8*, i8** %7
%73 = call i8* @strchr(i8* %72, i32 120)
%74 = icmp ne i8* %73, null
br i1 %74, label %75, label %81
75: ; preds = %71, %67
%76 = load i8*, i8** %6
%77 = load i8*, i8** %7
%78 = load double, double* %8
%79 = fptosi double %78 to i32
%80 = call i32 (i8*, i8*, ...) @sprintf(i8* %76, i8* %77, i32 %79)
br label %86
81: ; preds = %71
%82 = load i8*, i8** %6
%83 = load i8*, i8** %7
%84 = load double, double* %8
%85 = call i32 (i8*, i8*, ...) @sprintf(i8* %82, i8* %83, double %84)
br label %86
86: ; preds = %81, %75
ret void
}

LLVM IR (-O2):
@.str = [5 x i8] c"%.2f\00"
@.str.1 = [5 x i8] c"%.0e\00"
@.str.2 = [5 x i8] c"%.2g\00"
define void @WriteValue(i8* nocapture writeonly %0, i8* %1, double %2, i32 %3, i32 %4) {
%6 = icmp eq i32 %4, 0
br i1 %6, label %18, label %7
7: ; preds = %5
%8 = tail call double @llvm.floor.f64(double %2)
%9 = fcmp oeq double %8, %2
%10 = tail call i32 @strcmp(i8* dereferenceable(1) %1, i8* dereferenceable(5) getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0))
%11 = icmp eq i32 %10, 0
%12 = select i1 %11, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.1, i64 0, i64 0), i8* %1
%13 = select i1 %11, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0), i8* %1
%14 = select i1 %9, double 0.000000e+00, double %8
%15 = fsub double %2, %14
%16 = select i1 %9, i8* %12, i8* %13
%17 = tail call double @pow(double 1.000000e+01, double %15)
br label %77
18: ; preds = %5
%19 = icmp slt i32 %3, 0
br i1 %19, label %20, label %37
20: ; preds = %18
%21 = sub i32 0, %3
%22 = and i32 %21, 7
%23 = icmp eq i32 %22, 0
br i1 %23, label %32, label %24
24: ; preds = %20, %24
%25 = phi i32 [ %29, %24 ], [ %3, %20 ]
%26 = phi double [ %28, %24 ], [ %2, %20 ]
%27 = phi i32 [ %30, %24 ], [ 0, %20 ]
%28 = fmul double %26, 1.000000e+01
%29 = add i32 %25, 1
%30 = add i32 %27, 1
%31 = icmp eq i32 %30, %22
br i1 %31, label %32, label %24
32: ; preds = %24, %20
%33 = phi double [ undef, %20 ], [ %28, %24 ]
%34 = phi i32 [ %3, %20 ], [ %29, %24 ]
%35 = phi double [ %2, %20 ], [ %28, %24 ]
%36 = icmp ugt i32 %3, -8
br i1 %36, label %77, label %45
37: ; preds = %18
%38 = icmp eq i32 %3, 0
br i1 %38, label %77, label %39
39: ; preds = %37
%40 = add i32 %3, -1
%41 = and i32 %3, 3
%42 = icmp ult i32 %40, 3
br i1 %42, label %67, label %43
43: ; preds = %39
%44 = and i32 %3, -4
br label %58
45: ; preds = %32, %45
%46 = phi i32 [ %56, %45 ], [ %34, %32 ]
%47 = phi double [ %55, %45 ], [ %35, %32 ]
%48 = fmul double %47, 1.000000e+01
%49 = fmul double %48, 1.000000e+01
%50 = fmul double %49, 1.000000e+01
%51 = fmul double %50, 1.000000e+01
%52 = fmul double %51, 1.000000e+01
%53 = fmul double %52, 1.000000e+01
%54 = fmul double %53, 1.000000e+01
%55 = fmul double %54, 1.000000e+01
%56 = add i32 %46, 8
%57 = icmp eq i32 %56, 0
br i1 %57, label %77, label %45
58: ; preds = %58, %43
%59 = phi double [ %2, %43 ], [ %64, %58 ]
%60 = phi i32 [ 0, %43 ], [ %65, %58 ]
%61 = fdiv double %59, 1.000000e+01
%62 = fdiv double %61, 1.000000e+01
%63 = fdiv double %62, 1.000000e+01
%64 = fdiv double %63, 1.000000e+01
%65 = add i32 %60, 4
%66 = icmp eq i32 %65, %44
br i1 %66, label %67, label %58
67: ; preds = %58, %39
%68 = phi double [ undef, %39 ], [ %64, %58 ]
%69 = phi double [ %2, %39 ], [ %64, %58 ]
%70 = icmp eq i32 %41, 0
br i1 %70, label %77, label %71
71: ; preds = %67, %71
%72 = phi double [ %74, %71 ], [ %69, %67 ]
%73 = phi i32 [ %75, %71 ], [ 0, %67 ]
%74 = fdiv double %72, 1.000000e+01
%75 = add i32 %73, 1
%76 = icmp eq i32 %75, %41
br i1 %76, label %77, label %71
77: ; preds = %67, %71, %32, %45, %7, %37
%78 = phi double [ %2, %37 ], [ %17, %7 ], [ %33, %32 ], [ %55, %45 ], [ %68, %67 ], [ %74, %71 ]
%79 = phi i8* [ %1, %37 ], [ %16, %7 ], [ %1, %45 ], [ %1, %32 ], [ %1, %71 ], [ %1, %67 ]
%80 = tail call i8* @strchr(i8* dereferenceable(1) %79, i32 100)
%81 = icmp eq i8* %80, null
br i1 %81, label %82, label %85
82: ; preds = %77
%83 = tail call i8* @strchr(i8* dereferenceable(1) %79, i32 120)
%84 = icmp eq i8* %83, null
br i1 %84, label %88, label %85
85: ; preds = %82, %77
%86 = fptosi double %78 to i32
%87 = tail call i32 (i8*, i8*, ...) @sprintf(i8* dereferenceable(1) %0, i8* dereferenceable(1) %79, i32 %86)
br label %90
88: ; preds = %82
%89 = tail call i32 (i8*, i8*, ...) @sprintf(i8* dereferenceable(1) %0, i8* dereferenceable(1) %79, double %78)
br label %90
90: ; preds = %88, %85
ret void
}