#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int ceil_quot(unsigned int, int);
unsigned int recs_per_track(unsigned short dev_type, unsigned int kl,
                            unsigned int dl) {
  int dn, kn;
  switch (dev_type) {
  case 13184:
    if (kl)
      return 1499 / (15 + 7 + ceil_quot(kl + 12, 32) + ceil_quot(dl + 12, 32));
    else
      return 1499 / (15 + ceil_quot(dl + 12, 32));
  case 13200:
    dn = ceil_quot(dl + 6, 232) + 1;
    if (kl) {
      kn = ceil_quot(kl + 6, 232) + 1;
      return 1729 / (10 + 9 + ceil_quot(kl + 6 * kn, 34) + 9 +
                     ceil_quot(dl + 6 * dn, 34));
    } else {
      return 1729 / (10 + 9 + ceil_quot(dl + 6 * dn, 34));
    }
  case 37701:
    dn = ceil_quot(dl + 6, 232) + 1;
    if (kl) {
      kn = ceil_quot(kl + 6, 232) + 1;
      return 1420 /
             (18 + 7 + ceil_quot(kl + 6 * kn, 34) + ceil_quot(dl + 6 * dn, 34));
    } else {
      return 1420 / (18 + 7 + ceil_quot(dl + 6 * dn, 34));
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<recs_per_track>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %di,%ax
mov    %ax,-0x6(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
movzwl -0x6(%rbp),%eax
mov    %eax,-0x1c(%rbp)
sub    $0x3380,%eax
je     1162 <recs_per_track+0x52>
jmp    113c <recs_per_track+0x2c>
mov    -0x1c(%rbp),%eax
sub    $0x3390,%eax
je     11cc <recs_per_track+0xbc>
jmp    114f <recs_per_track+0x3f>
mov    -0x1c(%rbp),%eax
sub    $0x9345,%eax
je     126e <recs_per_track+0x15e>
jmp    130d <recs_per_track+0x1fd>
cmpl   $0x0,-0xc(%rbp)
je     11a7 <recs_per_track+0x97>
mov    -0xc(%rbp),%edi
add    $0xc,%edi
mov    $0x20,%esi
call   1030 <ceil_quot@plt>
add    $0x16,%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%edi
add    $0xc,%edi
mov    $0x20,%esi
call   1030 <ceil_quot@plt>
mov    -0x20(%rbp),%ecx
add    %eax,%ecx
mov    $0x5db,%eax
cltd
idiv   %ecx
mov    %eax,-0x4(%rbp)
jmp    1314 <recs_per_track+0x204>
mov    -0x10(%rbp),%edi
add    $0xc,%edi
mov    $0x20,%esi
call   1030 <ceil_quot@plt>
mov    %eax,%ecx
add    $0xf,%ecx
mov    $0x5db,%eax
cltd
idiv   %ecx
mov    %eax,-0x4(%rbp)
jmp    1314 <recs_per_track+0x204>
mov    -0x10(%rbp),%edi
add    $0x6,%edi
mov    $0xe8,%esi
call   1030 <ceil_quot@plt>
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0xc(%rbp)
je     1246 <recs_per_track+0x136>
mov    -0xc(%rbp),%edi
add    $0x6,%edi
mov    $0xe8,%esi
call   1030 <ceil_quot@plt>
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0xc(%rbp),%edi
imul   $0x6,-0x18(%rbp),%eax
add    %eax,%edi
mov    $0x22,%esi
call   1030 <ceil_quot@plt>
add    $0x13,%eax
add    $0x9,%eax
mov    %eax,-0x24(%rbp)
mov    -0x10(%rbp),%edi
imul   $0x6,-0x14(%rbp),%eax
add    %eax,%edi
mov    $0x22,%esi
call   1030 <ceil_quot@plt>
mov    -0x24(%rbp),%ecx
add    %eax,%ecx
mov    $0x6c1,%eax
cltd
idiv   %ecx
mov    %eax,-0x4(%rbp)
jmp    1314 <recs_per_track+0x204>
mov    -0x10(%rbp),%edi
imul   $0x6,-0x14(%rbp),%eax
add    %eax,%edi
mov    $0x22,%esi
call   1030 <ceil_quot@plt>
mov    %eax,%ecx
add    $0x13,%ecx
mov    $0x6c1,%eax
cltd
idiv   %ecx
mov    %eax,-0x4(%rbp)
jmp    1314 <recs_per_track+0x204>
mov    -0x10(%rbp),%edi
add    $0x6,%edi
mov    $0xe8,%esi
call   1030 <ceil_quot@plt>
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0xc(%rbp)
je     12e5 <recs_per_track+0x1d5>
mov    -0xc(%rbp),%edi
add    $0x6,%edi
mov    $0xe8,%esi
call   1030 <ceil_quot@plt>
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
mov    -0xc(%rbp),%edi
imul   $0x6,-0x18(%rbp),%eax
add    %eax,%edi
mov    $0x22,%esi
call   1030 <ceil_quot@plt>
add    $0x19,%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%edi
imul   $0x6,-0x14(%rbp),%eax
add    %eax,%edi
mov    $0x22,%esi
call   1030 <ceil_quot@plt>
mov    -0x28(%rbp),%ecx
add    %eax,%ecx
mov    $0x58c,%eax
cltd
idiv   %ecx
mov    %eax,-0x4(%rbp)
jmp    1314 <recs_per_track+0x204>
mov    -0x10(%rbp),%edi
imul   $0x6,-0x14(%rbp),%eax
add    %eax,%edi
mov    $0x22,%esi
call   1030 <ceil_quot@plt>
mov    %eax,%ecx
add    $0x19,%ecx
mov    $0x58c,%eax
cltd
idiv   %ecx
mov    %eax,-0x4(%rbp)
jmp    1314 <recs_per_track+0x204>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<recs_per_track>:
push   %r15
push   %r14
push   %rbx
mov    %edx,%r14d
mov    %esi,%ebx
cmp    $0x9345,%edi
je     1179 <recs_per_track+0x69>
movzwl %di,%ecx
cmp    $0x3390,%ecx
je     11d5 <recs_per_track+0xc5>
xor    %eax,%eax
cmp    $0x3380,%ecx
jne    1285 <recs_per_track+0x175>
test   %ebx,%ebx
je     122a <recs_per_track+0x11a>
add    $0xc,%ebx
mov    %ebx,%edi
mov    $0x20,%esi
call   1030 <ceil_quot@plt>
mov    %eax,%ebx
add    $0xc,%r14d
mov    %r14d,%edi
mov    $0x20,%esi
call   1030 <ceil_quot@plt>
lea    (%rbx,%rax,1),%ecx
add    $0x16,%ecx
mov    $0x5db,%eax
jmp    1281 <recs_per_track+0x171>
lea    0x6(%r14),%edi
mov    $0xe8,%esi
call   1030 <ceil_quot@plt>
mov    %eax,%r15d
add    $0x1,%r15d
test   %ebx,%ebx
je     1247 <recs_per_track+0x137>
lea    0x6(%rbx),%edi
mov    $0xe8,%esi
call   1030 <ceil_quot@plt>
lea    (%rax,%rax,2),%eax
lea    (%rbx,%rax,2),%edi
add    $0x6,%edi
mov    $0x22,%esi
call   1030 <ceil_quot@plt>
mov    %eax,%ebx
lea    (%r15,%r15,2),%eax
lea    (%r14,%rax,2),%edi
mov    $0x22,%esi
call   1030 <ceil_quot@plt>
lea    (%rbx,%rax,1),%ecx
add    $0x19,%ecx
jmp    125e <recs_per_track+0x14e>
lea    0x6(%r14),%edi
mov    $0xe8,%esi
call   1030 <ceil_quot@plt>
mov    %eax,%r15d
add    $0x1,%r15d
test   %ebx,%ebx
je     1265 <recs_per_track+0x155>
lea    0x6(%rbx),%edi
mov    $0xe8,%esi
call   1030 <ceil_quot@plt>
lea    (%rax,%rax,2),%eax
lea    (%rbx,%rax,2),%edi
add    $0x6,%edi
mov    $0x22,%esi
call   1030 <ceil_quot@plt>
mov    %eax,%ebx
lea    (%r15,%r15,2),%eax
lea    (%r14,%rax,2),%edi
mov    $0x22,%esi
call   1030 <ceil_quot@plt>
lea    (%rbx,%rax,1),%ecx
add    $0x1c,%ecx
jmp    127c <recs_per_track+0x16c>
add    $0xc,%r14d
mov    %r14d,%edi
mov    $0x20,%esi
call   1030 <ceil_quot@plt>
mov    %eax,%ecx
add    $0xf,%ecx
mov    $0x5db,%eax
jmp    1281 <recs_per_track+0x171>
lea    (%r15,%r15,2),%eax
lea    (%r14,%rax,2),%edi
mov    $0x22,%esi
call   1030 <ceil_quot@plt>
mov    %eax,%ecx
add    $0x19,%ecx
mov    $0x58c,%eax
jmp    1281 <recs_per_track+0x171>
lea    (%r15,%r15,2),%eax
lea    (%r14,%rax,2),%edi
mov    $0x22,%esi
call   1030 <ceil_quot@plt>
mov    %eax,%ecx
add    $0x13,%ecx
mov    $0x6c1,%eax
xor    %edx,%edx
idiv   %ecx
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define i32 @recs_per_track(i16 zeroext %0, i32 %1, i32 %2) {
%4 = alloca i32
%5 = alloca i16
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i16 %0, i16* %5
store i32 %1, i32* %6
store i32 %2, i32* %7
%10 = load i16, i16* %5
%11 = zext i16 %10 to i32
switch i32 %11, label %98 [
i32 13184, label %12
i32 13200, label %31
i32 37701, label %65
]
12: ; preds = %3
%13 = load i32, i32* %6
%14 = icmp ne i32 %13, 0
br i1 %14, label %15, label %25
15: ; preds = %12
%16 = load i32, i32* %6
%17 = add i32 %16, 12
%18 = call i32 @ceil_quot(i32 %17, i32 32)
%19 = add nsw i32 22, %18
%20 = load i32, i32* %7
%21 = add i32 %20, 12
%22 = call i32 @ceil_quot(i32 %21, i32 32)
%23 = add nsw i32 %19, %22
%24 = sdiv i32 1499, %23
store i32 %24, i32* %4
br label %99
25: ; preds = %12
%26 = load i32, i32* %7
%27 = add i32 %26, 12
%28 = call i32 @ceil_quot(i32 %27, i32 32)
%29 = add nsw i32 15, %28
%30 = sdiv i32 1499, %29
store i32 %30, i32* %4
br label %99
31: ; preds = %3
%32 = load i32, i32* %7
%33 = add i32 %32, 6
%34 = call i32 @ceil_quot(i32 %33, i32 232)
%35 = add nsw i32 %34, 1
store i32 %35, i32* %8
%36 = load i32, i32* %6
%37 = icmp ne i32 %36, 0
br i1 %37, label %38, label %57
38: ; preds = %31
%39 = load i32, i32* %6
%40 = add i32 %39, 6
%41 = call i32 @ceil_quot(i32 %40, i32 232)
%42 = add nsw i32 %41, 1
store i32 %42, i32* %9
%43 = load i32, i32* %6
%44 = load i32, i32* %9
%45 = mul nsw i32 6, %44
%46 = add i32 %43, %45
%47 = call i32 @ceil_quot(i32 %46, i32 34)
%48 = add nsw i32 19, %47
%49 = add nsw i32 %48, 9
%50 = load i32, i32* %7
%51 = load i32, i32* %8
%52 = mul nsw i32 6, %51
%53 = add i32 %50, %52
%54 = call i32 @ceil_quot(i32 %53, i32 34)
%55 = add nsw i32 %49, %54
%56 = sdiv i32 1729, %55
store i32 %56, i32* %4
br label %99
57: ; preds = %31
%58 = load i32, i32* %7
%59 = load i32, i32* %8
%60 = mul nsw i32 6, %59
%61 = add i32 %58, %60
%62 = call i32 @ceil_quot(i32 %61, i32 34)
%63 = add nsw i32 19, %62
%64 = sdiv i32 1729, %63
store i32 %64, i32* %4
br label %99
65: ; preds = %3
%66 = load i32, i32* %7
%67 = add i32 %66, 6
%68 = call i32 @ceil_quot(i32 %67, i32 232)
%69 = add nsw i32 %68, 1
store i32 %69, i32* %8
%70 = load i32, i32* %6
%71 = icmp ne i32 %70, 0
br i1 %71, label %72, label %90
72: ; preds = %65
%73 = load i32, i32* %6
%74 = add i32 %73, 6
%75 = call i32 @ceil_quot(i32 %74, i32 232)
%76 = add nsw i32 %75, 1
store i32 %76, i32* %9
%77 = load i32, i32* %6
%78 = load i32, i32* %9
%79 = mul nsw i32 6, %78
%80 = add i32 %77, %79
%81 = call i32 @ceil_quot(i32 %80, i32 34)
%82 = add nsw i32 25, %81
%83 = load i32, i32* %7
%84 = load i32, i32* %8
%85 = mul nsw i32 6, %84
%86 = add i32 %83, %85
%87 = call i32 @ceil_quot(i32 %86, i32 34)
%88 = add nsw i32 %82, %87
%89 = sdiv i32 1420, %88
store i32 %89, i32* %4
br label %99
90: ; preds = %65
%91 = load i32, i32* %7
%92 = load i32, i32* %8
%93 = mul nsw i32 6, %92
%94 = add i32 %91, %93
%95 = call i32 @ceil_quot(i32 %94, i32 34)
%96 = add nsw i32 25, %95
%97 = sdiv i32 1420, %96
store i32 %97, i32* %4
br label %99
98: ; preds = %3
store i32 0, i32* %4
br label %99
99: ; preds = %98, %90, %72, %57, %38, %25, %15
%100 = load i32, i32* %4
ret i32 %100
}

LLVM IR (-O2):
define i32 @recs_per_track(i16 zeroext %0, i32 %1, i32 %2) {
switch i16 %0, label %65 [
i16 13184, label %4
i16 13200, label %19
i16 -27835, label %42
]
4: ; preds = %3
%5 = icmp eq i32 %1, 0
br i1 %5, label %14, label %6
6: ; preds = %4
%7 = add i32 %1, 12
%8 = tail call i32 @ceil_quot(i32 %7, i32 32)
%9 = add nsw i32 %8, 22
%10 = add i32 %2, 12
%11 = tail call i32 @ceil_quot(i32 %10, i32 32)
%12 = add nsw i32 %9, %11
%13 = sdiv i32 1499, %12
br label %65
14: ; preds = %4
%15 = add i32 %2, 12
%16 = tail call i32 @ceil_quot(i32 %15, i32 32)
%17 = add nsw i32 %16, 15
%18 = sdiv i32 1499, %17
br label %65
19: ; preds = %3
%20 = add i32 %2, 6
%21 = tail call i32 @ceil_quot(i32 %20, i32 232)
%22 = add nsw i32 %21, 1
%23 = icmp eq i32 %1, 0
br i1 %23, label %36, label %24
24: ; preds = %19
%25 = add i32 %1, 6
%26 = tail call i32 @ceil_quot(i32 %25, i32 232)
%27 = mul i32 %26, 6
%28 = add i32 %25, %27
%29 = tail call i32 @ceil_quot(i32 %28, i32 34)
%30 = add nsw i32 %29, 28
%31 = mul nsw i32 %22, 6
%32 = add i32 %31, %2
%33 = tail call i32 @ceil_quot(i32 %32, i32 34)
%34 = add nsw i32 %30, %33
%35 = sdiv i32 1729, %34
br label %65
36: ; preds = %19
%37 = mul nsw i32 %22, 6
%38 = add i32 %37, %2
%39 = tail call i32 @ceil_quot(i32 %38, i32 34)
%40 = add nsw i32 %39, 19
%41 = sdiv i32 1729, %40
br label %65
42: ; preds = %3
%43 = add i32 %2, 6
%44 = tail call i32 @ceil_quot(i32 %43, i32 232)
%45 = add nsw i32 %44, 1
%46 = icmp eq i32 %1, 0
br i1 %46, label %59, label %47
47: ; preds = %42
%48 = add i32 %1, 6
%49 = tail call i32 @ceil_quot(i32 %48, i32 232)
%50 = mul i32 %49, 6
%51 = add i32 %48, %50
%52 = tail call i32 @ceil_quot(i32 %51, i32 34)
%53 = add nsw i32 %52, 25
%54 = mul nsw i32 %45, 6
%55 = add i32 %54, %2
%56 = tail call i32 @ceil_quot(i32 %55, i32 34)
%57 = add nsw i32 %53, %56
%58 = sdiv i32 1420, %57
br label %65
59: ; preds = %42
%60 = mul nsw i32 %45, 6
%61 = add i32 %60, %2
%62 = tail call i32 @ceil_quot(i32 %61, i32 34)
%63 = add nsw i32 %62, 25
%64 = sdiv i32 1420, %63
br label %65
65: ; preds = %3, %59, %47, %36, %24, %14, %6
%66 = phi i32 [ %58, %47 ], [ %64, %59 ], [ %35, %24 ], [ %41, %36 ], [ %13, %6 ], [ %18, %14 ], [ 0, %3 ]
ret i32 %66
}