float decode_depth(unsigned short depth) {
  depth &= (0x0fff | (1 << 12));
  if (depth <= 1000)
    return depth * 0.1 / 1.0;
  if (depth <= 1500)
    return 100 + (depth - 1000) * 0.2 / 1.0;
  if (depth <= 3100)
    return 200 + (depth - 1500) * 0.5 / 1.0;
  if (depth <= 8100)
    return 1000 + (depth - 3100) * 1.0 / 1.0;
  return 6000;
}


x86 assembly (clang, -O0):
<decode_depth>:
push   %rbp
mov    %rsp,%rbp
mov    %di,%ax
mov    %ax,-0x6(%rbp)
movzwl -0x6(%rbp),%eax
and    $0x1fff,%eax
mov    %ax,-0x6(%rbp)
movzwl -0x6(%rbp),%eax
cmp    $0x3e8,%eax
jg     1155 <decode_depth+0x55>
movzwl -0x6(%rbp),%eax
cvtsi2sd %eax,%xmm0
movsd  0xf01(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xecd(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    124c <decode_depth+0x14c>
movzwl -0x6(%rbp),%eax
cmp    $0x5dc,%eax
jg     11a3 <decode_depth+0xa3>
movzwl -0x6(%rbp),%eax
sub    $0x3e8,%eax
cvtsi2sd %eax,%xmm1
movsd  0xeb7(%rip),%xmm0
mulsd  %xmm0,%xmm1
movsd  0xe8b(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xe97(%rip),%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    124c <decode_depth+0x14c>
movzwl -0x6(%rbp),%eax
cmp    $0xc1c,%eax
jg     11f1 <decode_depth+0xf1>
movzwl -0x6(%rbp),%eax
sub    $0x5dc,%eax
cvtsi2sd %eax,%xmm1
movsd  0xe59(%rip),%xmm0
mulsd  %xmm0,%xmm1
movsd  0xe3d(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xe39(%rip),%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    124c <decode_depth+0x14c>
movzwl -0x6(%rbp),%eax
cmp    $0x1fa4,%eax
jg     123f <decode_depth+0x13f>
movzwl -0x6(%rbp),%eax
sub    $0xc1c,%eax
cvtsi2sd %eax,%xmm1
movsd  0xdfb(%rip),%xmm0
mulsd  %xmm0,%xmm1
movsd  0xdef(%rip),%xmm0
divsd  %xmm0,%xmm1
movsd  0xddb(%rip),%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    124c <decode_depth+0x14c>
movss  0xdb9(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<decode_depth>:
and    $0x1fff,%edi
cmp    $0x3e8,%edi
ja     111f <decode_depth+0x1f>
cvtsi2sd %edi,%xmm0
mulsd  0xf0e(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
ret
cmp    $0x5dc,%edi
ja     1146 <decode_depth+0x46>
add    $0xfffffc18,%edi
cvtsi2sd %edi,%xmm0
mulsd  0xedf(%rip),%xmm0
addsd  0xedf(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
ret
cmp    $0xc1c,%edi
ja     116d <decode_depth+0x6d>
add    $0xfffffa24,%edi
cvtsi2sd %edi,%xmm0
mulsd  0xea8(%rip),%xmm0
addsd  0xea8(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
ret
cmp    $0x1fa4,%edi
ja     1180 <decode_depth+0x80>
add    $0xfffff7cc,%edi
cvtsi2ss %edi,%xmm0
ret
movss  0xe78(%rip),%xmm0
ret

LLVM IR (-O0):
define float @decode_depth(i16 zeroext %0) {
%2 = alloca float
%3 = alloca i16
store i16 %0, i16* %3
%4 = load i16, i16* %3
%5 = zext i16 %4 to i32
%6 = and i32 %5, 8191
%7 = trunc i32 %6 to i16
store i16 %7, i16* %3
%8 = load i16, i16* %3
%9 = zext i16 %8 to i32
%10 = icmp sle i32 %9, 1000
br i1 %10, label %11, label %18
11: ; preds = %1
%12 = load i16, i16* %3
%13 = zext i16 %12 to i32
%14 = sitofp i32 %13 to double
%15 = fmul double %14, 1.000000e-01
%16 = fdiv double %15, 1.000000e+00
%17 = fptrunc double %16 to float
store float %17, float* %2
br label %58
18: ; preds = %1
%19 = load i16, i16* %3
%20 = zext i16 %19 to i32
%21 = icmp sle i32 %20, 1500
br i1 %21, label %22, label %31
22: ; preds = %18
%23 = load i16, i16* %3
%24 = zext i16 %23 to i32
%25 = sub nsw i32 %24, 1000
%26 = sitofp i32 %25 to double
%27 = fmul double %26, 2.000000e-01
%28 = fdiv double %27, 1.000000e+00
%29 = fadd double 1.000000e+02, %28
%30 = fptrunc double %29 to float
store float %30, float* %2
br label %58
31: ; preds = %18
%32 = load i16, i16* %3
%33 = zext i16 %32 to i32
%34 = icmp sle i32 %33, 3100
br i1 %34, label %35, label %44
35: ; preds = %31
%36 = load i16, i16* %3
%37 = zext i16 %36 to i32
%38 = sub nsw i32 %37, 1500
%39 = sitofp i32 %38 to double
%40 = fmul double %39, 5.000000e-01
%41 = fdiv double %40, 1.000000e+00
%42 = fadd double 2.000000e+02, %41
%43 = fptrunc double %42 to float
store float %43, float* %2
br label %58
44: ; preds = %31
%45 = load i16, i16* %3
%46 = zext i16 %45 to i32
%47 = icmp sle i32 %46, 8100
br i1 %47, label %48, label %57
48: ; preds = %44
%49 = load i16, i16* %3
%50 = zext i16 %49 to i32
%51 = sub nsw i32 %50, 3100
%52 = sitofp i32 %51 to double
%53 = fmul double %52, 1.000000e+00
%54 = fdiv double %53, 1.000000e+00
%55 = fadd double 1.000000e+03, %54
%56 = fptrunc double %55 to float
store float %56, float* %2
br label %58
57: ; preds = %44
store float 6.000000e+03, float* %2
br label %58
58: ; preds = %57, %48, %35, %22, %11
%59 = load float, float* %2
ret float %59
}

LLVM IR (-O2):
define float @decode_depth(i16 zeroext %0) {
%2 = and i16 %0, 8191
%3 = zext i16 %2 to i32
%4 = icmp ult i16 %2, 1001
br i1 %4, label %5, label %9
5: ; preds = %1
%6 = uitofp i16 %2 to double
%7 = fmul double %6, 1.000000e-01
%8 = fptrunc double %7 to float
br label %30
9: ; preds = %1
%10 = icmp ult i16 %2, 1501
br i1 %10, label %11, label %17
11: ; preds = %9
%12 = add nsw i32 %3, -1000
%13 = sitofp i32 %12 to double
%14 = fmul double %13, 2.000000e-01
%15 = fadd double %14, 1.000000e+02
%16 = fptrunc double %15 to float
br label %30
17: ; preds = %9
%18 = icmp ult i16 %2, 3101
br i1 %18, label %19, label %25
19: ; preds = %17
%20 = add nsw i32 %3, -1500
%21 = sitofp i32 %20 to double
%22 = fmul double %21, 5.000000e-01
%23 = fadd double %22, 2.000000e+02
%24 = fptrunc double %23 to float
br label %30
25: ; preds = %17
%26 = icmp ult i16 %2, 8101
br i1 %26, label %27, label %30
27: ; preds = %25
%28 = add nsw i32 %3, -2100
%29 = sitofp i32 %28 to float
br label %30
30: ; preds = %25, %27, %19, %11, %5
%31 = phi float [ %8, %5 ], [ %16, %11 ], [ %24, %19 ], [ %29, %27 ], [ 6.000000e+03, %25 ]
ret float %31
}