float get_stepsize(float x) {
  float q = 1;
  while (x > 10) {
    x /= 10;
    q *= 10;
  }
  while (x < 1 && x > 0) {
    x *= 10;
    q /= 10;
  }
  if (x < 2)
    return q * 0.2;
  if (x < 5)
    return q * 0.5;
  return q;
}


x86 assembly (clang, -O0):
<get_stepsize>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
movss  0xeef(%rip),%xmm0
movss  %xmm0,-0xc(%rbp)
movss  -0x8(%rbp),%xmm0
movss  0xee1(%rip),%xmm1
ucomiss %xmm1,%xmm0
jbe    1159 <get_stepsize+0x59>
movss  -0x8(%rbp),%xmm0
movss  0xecb(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  0xeba(%rip),%xmm0
mulss  -0xc(%rbp),%xmm0
movss  %xmm0,-0xc(%rbp)
jmp    1116 <get_stepsize+0x16>
jmp    115e <get_stepsize+0x5e>
xor    %eax,%eax
movss  0xe98(%rip),%xmm0
ucomiss -0x8(%rbp),%xmm0
mov    %al,-0xd(%rbp)
jbe    1186 <get_stepsize+0x86>
movss  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
seta   %al
mov    %al,-0xd(%rbp)
mov    -0xd(%rbp),%al
test   $0x1,%al
jne    1196 <get_stepsize+0x96>
jmp    11c3 <get_stepsize+0xc3>
movss  0xe66(%rip),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0xc(%rbp),%xmm0
movss  0xe4f(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0xc(%rbp)
jmp    115e <get_stepsize+0x5e>
movss  0xe3d(%rip),%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    11f8 <get_stepsize+0xf8>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe32(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1237 <get_stepsize+0x137>
movss  0xe0c(%rip),%xmm0
ucomiss -0x8(%rbp),%xmm0
jbe    122d <get_stepsize+0x12d>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdf5(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1237 <get_stepsize+0x137>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_stepsize>:
movaps %xmm0,%xmm1
movss  0xef5(%rip),%xmm2
ucomiss 0xef2(%rip),%xmm0
jbe    1144 <get_stepsize+0x44>
movss  0xee4(%rip),%xmm0
movss  0xee0(%rip),%xmm3
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
divss  %xmm3,%xmm1
mulss  %xmm3,%xmm0
ucomiss %xmm3,%xmm1
ja     1130 <get_stepsize+0x30>
ucomiss %xmm1,%xmm2
ja     114c <get_stepsize+0x4c>
jmp    1182 <get_stepsize+0x82>
movaps %xmm2,%xmm0
ucomiss %xmm1,%xmm2
jbe    1182 <get_stepsize+0x82>
xorps  %xmm2,%xmm2
ucomiss %xmm2,%xmm1
jbe    1182 <get_stepsize+0x82>
movss  0xea8(%rip),%xmm3
movss  0xe9c(%rip),%xmm4
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mulss  %xmm3,%xmm1
divss  %xmm3,%xmm0
ucomiss %xmm1,%xmm4
jbe    1182 <get_stepsize+0x82>
ucomiss %xmm2,%xmm1
ja     1170 <get_stepsize+0x70>
movss  0xe7e(%rip),%xmm2
ucomiss %xmm1,%xmm2
jbe    11a0 <get_stepsize+0xa0>
cvtss2sd %xmm0,%xmm0
mulsd  0xe7d(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
ret
movss  0xe64(%rip),%xmm2
ucomiss %xmm1,%xmm2
jbe    11b5 <get_stepsize+0xb5>
mulss  0xe5b(%rip),%xmm0
ret

LLVM IR (-O0):
define float @get_stepsize(float %0) {
%2 = alloca float
%3 = alloca float
%4 = alloca float
store float %0, float* %3
store float 1.000000e+00, float* %4
br label %5
5: ; preds = %8, %1
%6 = load float, float* %3
%7 = fcmp ogt float %6, 1.000000e+01
br i1 %7, label %8, label %13
8: ; preds = %5
%9 = load float, float* %3
%10 = fdiv float %9, 1.000000e+01
store float %10, float* %3
%11 = load float, float* %4
%12 = fmul float %11, 1.000000e+01
store float %12, float* %4
br label %5
13: ; preds = %5
br label %14
14: ; preds = %22, %13
%15 = load float, float* %3
%16 = fcmp olt float %15, 1.000000e+00
br i1 %16, label %17, label %20
17: ; preds = %14
%18 = load float, float* %3
%19 = fcmp ogt float %18, 0.000000e+00
br label %20
20: ; preds = %17, %14
%21 = phi i1 [ false, %14 ], [ %19, %17 ]
br i1 %21, label %22, label %27
22: ; preds = %20
%23 = load float, float* %3
%24 = fmul float %23, 1.000000e+01
store float %24, float* %3
%25 = load float, float* %4
%26 = fdiv float %25, 1.000000e+01
store float %26, float* %4
br label %14
27: ; preds = %20
%28 = load float, float* %3
%29 = fcmp olt float %28, 2.000000e+00
br i1 %29, label %30, label %35
30: ; preds = %27
%31 = load float, float* %4
%32 = fpext float %31 to double
%33 = fmul double %32, 2.000000e-01
%34 = fptrunc double %33 to float
store float %34, float* %2
br label %45
35: ; preds = %27
%36 = load float, float* %3
%37 = fcmp olt float %36, 5.000000e+00
br i1 %37, label %38, label %43
38: ; preds = %35
%39 = load float, float* %4
%40 = fpext float %39 to double
%41 = fmul double %40, 5.000000e-01
%42 = fptrunc double %41 to float
store float %42, float* %2
br label %45
43: ; preds = %35
%44 = load float, float* %4
store float %44, float* %2
br label %45
45: ; preds = %43, %38, %30
%46 = load float, float* %2
ret float %46
}

LLVM IR (-O2):
define float @get_stepsize(float %0) {
%2 = fcmp ogt float %0, 1.000000e+01
br i1 %2, label %9, label %3
3: ; preds = %9, %1
%4 = phi float [ %0, %1 ], [ %12, %9 ]
%5 = phi float [ 1.000000e+00, %1 ], [ %13, %9 ]
%6 = fcmp olt float %4, 1.000000e+00
%7 = fcmp ogt float %4, 0.000000e+00
%8 = and i1 %6, %7
br i1 %8, label %15, label %23
9: ; preds = %1, %9
%10 = phi float [ %13, %9 ], [ 1.000000e+00, %1 ]
%11 = phi float [ %12, %9 ], [ %0, %1 ]
%12 = fdiv float %11, 1.000000e+01
%13 = fmul float %10, 1.000000e+01
%14 = fcmp ogt float %12, 1.000000e+01
br i1 %14, label %9, label %3
15: ; preds = %3, %15
%16 = phi float [ %19, %15 ], [ %5, %3 ]
%17 = phi float [ %18, %15 ], [ %4, %3 ]
%18 = fmul float %17, 1.000000e+01
%19 = fdiv float %16, 1.000000e+01
%20 = fcmp olt float %18, 1.000000e+00
%21 = fcmp ogt float %18, 0.000000e+00
%22 = and i1 %20, %21
br i1 %22, label %15, label %23
23: ; preds = %15, %3
%24 = phi float [ %4, %3 ], [ %18, %15 ]
%25 = phi float [ %5, %3 ], [ %19, %15 ]
%26 = fcmp olt float %24, 2.000000e+00
br i1 %26, label %27, label %31
27: ; preds = %23
%28 = fpext float %25 to double
%29 = fmul double %28, 2.000000e-01
%30 = fptrunc double %29 to float
br label %35
31: ; preds = %23
%32 = fcmp olt float %24, 5.000000e+00
br i1 %32, label %33, label %35
33: ; preds = %31
%34 = fmul float %25, 5.000000e-01
br label %35
35: ; preds = %31, %33, %27
%36 = phi float [ %30, %27 ], [ %34, %33 ], [ %25, %31 ]
ret float %36
}