float get_stepsize(float x) {
  float q = 1.0;
  if (x <= 0.0)
    return 0.0;
  while (x > 10.0) {
    x /= 10.0;
    q *= 10.0;
  }
  while (x < 1.0 && x > 0.0) {
    x *= 10.0;
    q /= 10.0;
  }
  if (x < 2.0)
    return q * 0.2;
  if (x < 5.0)
    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
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jb     1139 <get_stepsize+0x39>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12ac <get_stepsize+0x1ac>
jmp    113e <get_stepsize+0x3e>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xeb9(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    119a <get_stepsize+0x9a>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe9e(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe80(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
jmp    113e <get_stepsize+0x3e>
jmp    119f <get_stepsize+0x9f>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xor    %eax,%eax
movsd  0xe5e(%rip),%xmm0
ucomisd %xmm1,%xmm0
mov    %al,-0xd(%rbp)
jbe    11d5 <get_stepsize+0xd5>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
seta   %al
mov    %al,-0xd(%rbp)
mov    -0xd(%rbp),%al
test   $0x1,%al
jne    11e5 <get_stepsize+0xe5>
jmp    1226 <get_stepsize+0x126>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe12(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x8(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdf4(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0xc(%rbp)
jmp    119f <get_stepsize+0x9f>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xde1(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    1264 <get_stepsize+0x164>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdde(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12ac <get_stepsize+0x1ac>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xdab(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    12a2 <get_stepsize+0x1a2>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd98(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12ac <get_stepsize+0x1ac>
movss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_stepsize>:
movaps %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomiss %xmm1,%xmm0
jae    11b5 <get_stepsize+0xb5>
movss  0xee9(%rip),%xmm2
ucomiss 0xee6(%rip),%xmm1
jbe    1144 <get_stepsize+0x44>
movss  0xed8(%rip),%xmm0
movss  0xed4(%rip),%xmm3
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
%5 = load float, float* %3
%6 = fpext float %5 to double
%7 = fcmp ole double %6, 0.000000e+00
br i1 %7, label %8, label %9
8: ; preds = %1
store float 0.000000e+00, float* %2
br label %63
9: ; preds = %1
br label %10
10: ; preds = %14, %9
%11 = load float, float* %3
%12 = fpext float %11 to double
%13 = fcmp ogt double %12, 1.000000e+01
br i1 %13, label %14, label %23
14: ; preds = %10
%15 = load float, float* %3
%16 = fpext float %15 to double
%17 = fdiv double %16, 1.000000e+01
%18 = fptrunc double %17 to float
store float %18, float* %3
%19 = load float, float* %4
%20 = fpext float %19 to double
%21 = fmul double %20, 1.000000e+01
%22 = fptrunc double %21 to float
store float %22, float* %4
br label %10
23: ; preds = %10
br label %24
24: ; preds = %34, %23
%25 = load float, float* %3
%26 = fpext float %25 to double
%27 = fcmp olt double %26, 1.000000e+00
br i1 %27, label %28, label %32
28: ; preds = %24
%29 = load float, float* %3
%30 = fpext float %29 to double
%31 = fcmp ogt double %30, 0.000000e+00
br label %32
32: ; preds = %28, %24
%33 = phi i1 [ false, %24 ], [ %31, %28 ]
br i1 %33, label %34, label %43
34: ; preds = %32
%35 = load float, float* %3
%36 = fpext float %35 to double
%37 = fmul double %36, 1.000000e+01
%38 = fptrunc double %37 to float
store float %38, float* %3
%39 = load float, float* %4
%40 = fpext float %39 to double
%41 = fdiv double %40, 1.000000e+01
%42 = fptrunc double %41 to float
store float %42, float* %4
br label %24
43: ; preds = %32
%44 = load float, float* %3
%45 = fpext float %44 to double
%46 = fcmp olt double %45, 2.000000e+00
br i1 %46, label %47, label %52
47: ; preds = %43
%48 = load float, float* %4
%49 = fpext float %48 to double
%50 = fmul double %49, 2.000000e-01
%51 = fptrunc double %50 to float
store float %51, float* %2
br label %63
52: ; preds = %43
%53 = load float, float* %3
%54 = fpext float %53 to double
%55 = fcmp olt double %54, 5.000000e+00
br i1 %55, label %56, label %61
56: ; preds = %52
%57 = load float, float* %4
%58 = fpext float %57 to double
%59 = fmul double %58, 5.000000e-01
%60 = fptrunc double %59 to float
store float %60, float* %2
br label %63
61: ; preds = %52
%62 = load float, float* %4
store float %62, float* %2
br label %63
63: ; preds = %61, %56, %47, %8
%64 = load float, float* %2
ret float %64
}

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