int vid_from_reg(int val, int vrm) {
  int vid;
  switch (vrm) {
  case 100:
    if ((val & 0x1f) == 0x1f)
      return 0;
    if ((val & 0x1f) <= 0x09 || val == 0x0a)
      vid = 10875 - (val & 0x1f) * 250;
    else
      vid = 18625 - (val & 0x1f) * 250;
    if (val & 0x20)
      vid -= 125;
    vid /= 10;
    return vid;
  case 24:
    return (val == 0x1f ? 0 : 1550 - val * 25);
  case 91:
  case 90:
    return (val == 0x1f ? 0 : 1850 - val * 25);
  case 85:
    return ((val & 0x10 ? 25 : 0) + ((val & 0x0f) > 0x04 ? 2050 : 1250) -
            ((val & 0x0f) * 50));
  case 84:
    val &= 0x0f;
  default:
    return (val == 0x1f ? 0 : val & 0x10 ? 5100 - (val)*100 : 2050 - (val)*50);
  }
}


x86 assembly (clang, -O0):
<vid_from_reg>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x14(%rbp)
sub    $0x18,%eax
je     11fb <vid_from_reg+0xfb>
jmp    111e <vid_from_reg+0x1e>
mov    -0x14(%rbp),%eax
sub    $0x54,%eax
je     1293 <vid_from_reg+0x193>
jmp    112f <vid_from_reg+0x2f>
mov    -0x14(%rbp),%eax
sub    $0x55,%eax
je     1255 <vid_from_reg+0x155>
jmp    1140 <vid_from_reg+0x40>
mov    -0x14(%rbp),%eax
add    $0xffffffa6,%eax
sub    $0x2,%eax
jb     1228 <vid_from_reg+0x128>
jmp    1154 <vid_from_reg+0x54>
mov    -0x14(%rbp),%eax
sub    $0x64,%eax
jne    129c <vid_from_reg+0x19c>
jmp    1165 <vid_from_reg+0x65>
mov    -0x8(%rbp),%eax
and    $0x1f,%eax
cmp    $0x1f,%eax
jne    1180 <vid_from_reg+0x80>
movl   $0x0,-0x4(%rbp)
jmp    12ec <vid_from_reg+0x1ec>
mov    -0x8(%rbp),%eax
and    $0x1f,%eax
cmp    $0x9,%eax
jle    1199 <vid_from_reg+0x99>
cmpl   $0xa,-0x8(%rbp)
jne    11b4 <vid_from_reg+0xb4>
mov    -0x8(%rbp),%eax
and    $0x1f,%eax
imul   $0xfa,%eax,%ecx
mov    $0x2a7b,%eax
sub    %ecx,%eax
mov    %eax,-0x10(%rbp)
jmp    11ca <vid_from_reg+0xca>
mov    -0x8(%rbp),%eax
and    $0x1f,%eax
imul   $0xfa,%eax,%ecx
mov    $0x48c1,%eax
sub    %ecx,%eax
mov    %eax,-0x10(%rbp)
mov    -0x8(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     11e2 <vid_from_reg+0xe2>
mov    -0x10(%rbp),%eax
sub    $0x7d,%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12ec <vid_from_reg+0x1ec>
cmpl   $0x1f,-0x8(%rbp)
jne    120f <vid_from_reg+0x10f>
xor    %eax,%eax
mov    %eax,-0x18(%rbp)
jmp    121d <vid_from_reg+0x11d>
imul   $0x19,-0x8(%rbp),%ecx
mov    $0x60e,%eax
sub    %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12ec <vid_from_reg+0x1ec>
cmpl   $0x1f,-0x8(%rbp)
jne    123c <vid_from_reg+0x13c>
xor    %eax,%eax
mov    %eax,-0x1c(%rbp)
jmp    124a <vid_from_reg+0x14a>
imul   $0x19,-0x8(%rbp),%ecx
mov    $0x73a,%eax
sub    %ecx,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    12ec <vid_from_reg+0x1ec>
mov    -0x8(%rbp),%edx
and    $0x10,%edx
xor    %eax,%eax
mov    $0x19,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    -0x8(%rbp),%esi
and    $0xf,%esi
mov    $0x4e2,%ecx
mov    $0x802,%edx
cmp    $0x4,%esi
cmovg  %edx,%ecx
add    %ecx,%eax
mov    -0x8(%rbp),%ecx
and    $0xf,%ecx
imul   $0x32,%ecx,%ecx
sub    %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12ec <vid_from_reg+0x1ec>
mov    -0x8(%rbp),%eax
and    $0xf,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x1f,-0x8(%rbp)
jne    12b0 <vid_from_reg+0x1b0>
xor    %eax,%eax
mov    %eax,-0x20(%rbp)
jmp    12e6 <vid_from_reg+0x1e6>
mov    -0x8(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     12d2 <vid_from_reg+0x1d2>
imul   $0x64,-0x8(%rbp),%ecx
mov    $0x13ec,%eax
sub    %ecx,%eax
mov    %eax,-0x24(%rbp)
jmp    12e0 <vid_from_reg+0x1e0>
imul   $0x32,-0x8(%rbp),%ecx
mov    $0x802,%eax
sub    %ecx,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<vid_from_reg>:
lea    -0x54(%rsi),%eax
cmp    $0x10,%eax
ja     1123 <vid_from_reg+0x23>
lea    0xef1(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
imul   $0xffffffe7,%edi,%ecx
add    $0x73a,%ecx
jmp    1131 <vid_from_reg+0x31>
cmp    $0x18,%esi
jne    113a <vid_from_reg+0x3a>
imul   $0xffffffe7,%edi,%ecx
add    $0x60e,%ecx
xor    %eax,%eax
cmp    $0x1f,%edi
cmovne %ecx,%eax
ret
xor    %eax,%eax
cmp    $0x1f,%edi
jne    1145 <vid_from_reg+0x45>
ret
and    $0xf,%edi
test   $0x10,%dil
jne    11bf <vid_from_reg+0xbf>
imul   $0xffffffce,%edi,%eax
add    $0x802,%eax
ret
mov    %edi,%ecx
and    $0x1f,%ecx
xor    %eax,%eax
cmp    $0x1f,%ecx
je     1141 <vid_from_reg+0x41>
imul   $0xffffff06,%ecx,%eax
cmp    $0xa,%ecx
mov    $0x2a7b,%ecx
mov    $0x48c1,%edx
cmovb  %ecx,%edx
cmp    $0xa,%edi
cmove  %ecx,%edx
lea    (%rdx,%rax,1),%ecx
test   $0x20,%dil
lea    0xff83(%rdx,%rax,1),%eax
cmove  %ecx,%eax
movzwl %ax,%eax
imul   $0xcccd,%eax,%eax
shr    $0x13,%eax
ret
mov    %edi,%ecx
shl    $0x1b,%ecx
sar    $0x1f,%ecx
and    $0x19,%ecx
and    $0xf,%edi
imul   $0xffffffce,%edi,%eax
lea    0x4e2(%rax),%edx
add    $0x802,%eax
cmp    $0x5,%edi
cmovb  %edx,%eax
add    %ecx,%eax
ret
imul   $0xffffff9c,%edi,%eax
add    $0x13ec,%eax
ret

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

LLVM IR (-O2):
define i32 @vid_from_reg(i32 %0, i32 %1) {
switch i32 %1, label %42 [
i32 100, label %3
i32 24, label %20
i32 91, label %25
i32 90, label %25
i32 85, label %30
i32 84, label %40
]
3: ; preds = %2
%4 = and i32 %0, 31
%5 = icmp eq i32 %4, 31
br i1 %5, label %54, label %6
6: ; preds = %3
%7 = icmp ult i32 %4, 10
%8 = icmp eq i32 %0, 10
%9 = or i1 %8, %7
%10 = mul nsw i32 %4, -250
%11 = select i1 %9, i32 10875, i32 18625
%12 = add nsw i32 %11, %10
%13 = and i32 %0, 32
%14 = icmp eq i32 %13, 0
%15 = add nuw nsw i32 %12, 65411
%16 = select i1 %14, i32 %12, i32 %15
%17 = trunc i32 %16 to i16
%18 = udiv i16 %17, 10
%19 = zext i16 %18 to i32
br label %54
20: ; preds = %2
%21 = icmp eq i32 %0, 31
%22 = mul i32 %0, -25
%23 = add i32 %22, 1550
%24 = select i1 %21, i32 0, i32 %23
br label %54
25: ; preds = %2, %2
%26 = icmp eq i32 %0, 31
%27 = mul i32 %0, -25
%28 = add i32 %27, 1850
%29 = select i1 %26, i32 0, i32 %28
br label %54
30: ; preds = %2
%31 = and i32 %0, 16
%32 = icmp eq i32 %31, 0
%33 = select i1 %32, i32 0, i32 25
%34 = and i32 %0, 15
%35 = icmp ugt i32 %34, 4
%36 = select i1 %35, i32 2050, i32 1250
%37 = mul nsw i32 %34, -50
%38 = add nsw i32 %36, %37
%39 = add nuw nsw i32 %38, %33
br label %54
40: ; preds = %2
%41 = and i32 %0, 15
br label %44
42: ; preds = %2
%43 = icmp eq i32 %0, 31
br i1 %43, label %54, label %44
44: ; preds = %40, %42
%45 = phi i32 [ %41, %40 ], [ %0, %42 ]
%46 = and i32 %45, 16
%47 = icmp eq i32 %46, 0
br i1 %47, label %51, label %48
48: ; preds = %44
%49 = mul i32 %45, -100
%50 = add i32 %49, 5100
br label %54
51: ; preds = %44
%52 = mul i32 %45, -50
%53 = add i32 %52, 2050
br label %54
54: ; preds = %42, %51, %48, %3, %30, %25, %20, %6
%55 = phi i32 [ %39, %30 ], [ %29, %25 ], [ %24, %20 ], [ %19, %6 ], [ 0, %3 ], [ 0, %42 ], [ %50, %48 ], [ %53, %51 ]
ret i32 %55
}