double tldim(double tlmin, double tlmax, double binsiz, int type) {
  if ((binsiz == 1.0) || (binsiz <= 0.0)) {
    switch (type) {
    case 'B':
    case 'I':
    case 'U':
    case 'J':
    case 'K':
    case 'V':
    default:
      return ((tlmax - tlmin) + 1.0);
    case 'E':
    case 'D':
      return (tlmax - tlmin);
    }
  } else {
    switch (type) {
    case 'B':
    case 'I':
    case 'U':
    case 'J':
    case 'K':
    case 'V':
    default:
      return ((tlmax - tlmin) / binsiz + 1.0);
    case 'E':
    case 'D':
      return ((tlmax - tlmin) / binsiz);
    }
  }
}


x86 assembly (clang, -O0):
<tldim>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  %xmm2,-0x20(%rbp)
mov    %edi,-0x24(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  0xedd(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1138 <tldim+0x38>
jp     1138 <tldim+0x38>
jmp    1146 <tldim+0x46>
xorps  %xmm0,%xmm0
ucomisd -0x20(%rbp),%xmm0
jb     11cf <tldim+0xcf>
mov    -0x24(%rbp),%eax
mov    %eax,-0x28(%rbp)
sub    $0x42,%eax
je     1196 <tldim+0x96>
jmp    115a <tldim+0x5a>
mov    -0x28(%rbp),%eax
add    $0xffffffbc,%eax
sub    $0x2,%eax
jb     11bb <tldim+0xbb>
jmp    116e <tldim+0x6e>
mov    -0x28(%rbp),%eax
add    $0xffffffb7,%eax
sub    $0x3,%eax
jb     1196 <tldim+0x96>
jmp    1182 <tldim+0x82>
mov    -0x28(%rbp),%eax
add    $0xffffffab,%eax
sub    $0x1,%eax
ja     119b <tldim+0x9b>
jmp    1196 <tldim+0x96>
jmp    119b <tldim+0x9b>
movsd  -0x18(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  0xe53(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    125d <tldim+0x15d>
movsd  -0x18(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    125d <tldim+0x15d>
mov    -0x24(%rbp),%eax
mov    %eax,-0x2c(%rbp)
sub    $0x42,%eax
je     121f <tldim+0x11f>
jmp    11e3 <tldim+0xe3>
mov    -0x2c(%rbp),%eax
add    $0xffffffbc,%eax
sub    $0x2,%eax
jb     1249 <tldim+0x149>
jmp    11f7 <tldim+0xf7>
mov    -0x2c(%rbp),%eax
add    $0xffffffb7,%eax
sub    $0x3,%eax
jb     121f <tldim+0x11f>
jmp    120b <tldim+0x10b>
mov    -0x2c(%rbp),%eax
add    $0xffffffab,%eax
sub    $0x1,%eax
ja     1224 <tldim+0x124>
jmp    121f <tldim+0x11f>
jmp    1224 <tldim+0x124>
movsd  -0x18(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
divsd  -0x20(%rbp),%xmm0
movsd  0xdc5(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    125d <tldim+0x15d>
movsd  -0x18(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
divsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<tldim>:
and    $0xfffffffe,%edi
subsd  %xmm0,%xmm1
xorpd  %xmm0,%xmm0
movapd %xmm2,%xmm3
cmplesd %xmm0,%xmm3
movsd  0xee4(%rip),%xmm0
movapd %xmm3,%xmm4
andpd  %xmm0,%xmm4
andnpd %xmm2,%xmm3
orpd   %xmm4,%xmm3
cmpeqsd %xmm0,%xmm2
movapd %xmm2,%xmm4
andnpd %xmm3,%xmm4
andpd  %xmm0,%xmm2
orpd   %xmm4,%xmm2
divsd  %xmm2,%xmm1
cmp    $0x44,%edi
je     114e <tldim+0x4e>
addsd  %xmm0,%xmm1
movapd %xmm1,%xmm0
ret

LLVM IR (-O0):
define double @tldim(double %0, double %1, double %2, i32 %3) {
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca i32
store double %0, double* %6
store double %1, double* %7
store double %2, double* %8
store i32 %3, i32* %9
%10 = load double, double* %8
%11 = fcmp oeq double %10, 1.000000e+00
br i1 %11, label %15, label %12
12: ; preds = %4
%13 = load double, double* %8
%14 = fcmp ole double %13, 0.000000e+00
br i1 %14, label %15, label %27
15: ; preds = %12, %4
%16 = load i32, i32* %9
switch i32 %16, label %18 [
i32 66, label %17
i32 73, label %17
i32 85, label %17
i32 74, label %17
i32 75, label %17
i32 86, label %17
i32 69, label %23
i32 68, label %23
]
17: ; preds = %15, %15, %15, %15, %15, %15
br label %18
18: ; preds = %15, %17
%19 = load double, double* %7
%20 = load double, double* %6
%21 = fsub double %19, %20
%22 = fadd double %21, 1.000000e+00
store double %22, double* %5
br label %43
23: ; preds = %15, %15
%24 = load double, double* %7
%25 = load double, double* %6
%26 = fsub double %24, %25
store double %26, double* %5
br label %43
27: ; preds = %12
%28 = load i32, i32* %9
switch i32 %28, label %30 [
i32 66, label %29
i32 73, label %29
i32 85, label %29
i32 74, label %29
i32 75, label %29
i32 86, label %29
i32 69, label %37
i32 68, label %37
]
29: ; preds = %27, %27, %27, %27, %27, %27
br label %30
30: ; preds = %27, %29
%31 = load double, double* %7
%32 = load double, double* %6
%33 = fsub double %31, %32
%34 = load double, double* %8
%35 = fdiv double %33, %34
%36 = fadd double %35, 1.000000e+00
store double %36, double* %5
br label %43
37: ; preds = %27, %27
%38 = load double, double* %7
%39 = load double, double* %6
%40 = fsub double %38, %39
%41 = load double, double* %8
%42 = fdiv double %40, %41
store double %42, double* %5
br label %43
43: ; preds = %37, %30, %23, %18
%44 = load double, double* %5
ret double %44
}

LLVM IR (-O2):
define double @tldim(double %0, double %1, double %2, i32 %3) {
%5 = fcmp oeq double %2, 1.000000e+00
%6 = fcmp ole double %2, 0.000000e+00
%7 = or i1 %5, %6
%8 = and i32 %3, -2
%9 = icmp eq i32 %8, 68
%10 = fsub double %1, %0
%11 = select i1 %7, double 1.000000e+00, double %2
%12 = fdiv double %10, %11
%13 = fadd double %12, 1.000000e+00
%14 = select i1 %9, double %12, double %13
ret double %14
}