unsigned short cp1251towc(char c) {
  unsigned char uc = c;
  if (uc >= 192)
    return 0x0410 + (uc - 192);
  else if (uc == 168)
    return 0x0401;
  else if (uc == 184)
    return 0x0451;
  else if (uc == 170)
    return 0x0404;
  else if (uc == 186)
    return 0x0454;
  else if (uc == 178)
    return 0x0406;
  else if (uc == 179)
    return 0x0456;
  else if (uc == 175)
    return 0x0407;
  else if (uc == 191)
    return 0x0457;
  else if (uc == 161)
    return 0x040e;
  else if (uc == 162)
    return 0x045e;
  return (unsigned short)uc;
}


x86 assembly (clang, -O0):
<cp1251towc>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
mov    %al,-0x3(%rbp)
mov    -0x3(%rbp),%al
mov    %al,-0x4(%rbp)
movzbl -0x4(%rbp),%eax
cmp    $0xc0,%eax
jl     1136 <cp1251towc+0x36>
movzbl -0x4(%rbp),%eax
sub    $0xc0,%eax
add    $0x410,%eax
mov    %ax,-0x2(%rbp)
jmp    1274 <cp1251towc+0x174>
movzbl -0x4(%rbp),%eax
cmp    $0xa8,%eax
jne    1150 <cp1251towc+0x50>
movw   $0x401,-0x2(%rbp)
jmp    1274 <cp1251towc+0x174>
movzbl -0x4(%rbp),%eax
cmp    $0xb8,%eax
jne    116a <cp1251towc+0x6a>
movw   $0x451,-0x2(%rbp)
jmp    1274 <cp1251towc+0x174>
movzbl -0x4(%rbp),%eax
cmp    $0xaa,%eax
jne    1184 <cp1251towc+0x84>
movw   $0x404,-0x2(%rbp)
jmp    1274 <cp1251towc+0x174>
movzbl -0x4(%rbp),%eax
cmp    $0xba,%eax
jne    119e <cp1251towc+0x9e>
movw   $0x454,-0x2(%rbp)
jmp    1274 <cp1251towc+0x174>
movzbl -0x4(%rbp),%eax
cmp    $0xb2,%eax
jne    11b8 <cp1251towc+0xb8>
movw   $0x406,-0x2(%rbp)
jmp    1274 <cp1251towc+0x174>
movzbl -0x4(%rbp),%eax
cmp    $0xb3,%eax
jne    11d2 <cp1251towc+0xd2>
movw   $0x456,-0x2(%rbp)
jmp    1274 <cp1251towc+0x174>
movzbl -0x4(%rbp),%eax
cmp    $0xaf,%eax
jne    11ec <cp1251towc+0xec>
movw   $0x407,-0x2(%rbp)
jmp    1274 <cp1251towc+0x174>
movzbl -0x4(%rbp),%eax
cmp    $0xbf,%eax
jne    1206 <cp1251towc+0x106>
movw   $0x457,-0x2(%rbp)
jmp    1274 <cp1251towc+0x174>
movzbl -0x4(%rbp),%eax
cmp    $0xa1,%eax
jne    1220 <cp1251towc+0x120>
movw   $0x40e,-0x2(%rbp)
jmp    1274 <cp1251towc+0x174>
movzbl -0x4(%rbp),%eax
cmp    $0xa2,%eax
jne    123a <cp1251towc+0x13a>
movw   $0x45e,-0x2(%rbp)
jmp    1274 <cp1251towc+0x174>
jmp    123f <cp1251towc+0x13f>
jmp    1244 <cp1251towc+0x144>
jmp    1249 <cp1251towc+0x149>
jmp    124e <cp1251towc+0x14e>
jmp    1253 <cp1251towc+0x153>
jmp    1258 <cp1251towc+0x158>
jmp    125d <cp1251towc+0x15d>
jmp    1262 <cp1251towc+0x162>
jmp    1267 <cp1251towc+0x167>
jmp    126c <cp1251towc+0x16c>
movzbl -0x4(%rbp),%eax
mov    %ax,-0x2(%rbp)
movzwl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<cp1251towc>:
cmp    $0xc0,%dil
jb     1110 <cp1251towc+0x10>
movzbl %dil,%eax
add    $0x350,%eax
ret
lea    0x5f(%rdi),%ecx
cmp    $0x1e,%cl
ja     1139 <cp1251towc+0x39>
mov    $0x401,%ax
movzbl %cl,%ecx
lea    0xeda(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
mov    $0x40e,%ax
ret
mov    $0x45e,%ax
ret
movzbl %dil,%eax
ret
mov    $0x404,%ax
ret
mov    $0x407,%ax
ret
mov    $0x406,%ax
ret
mov    $0x456,%ax
ret
mov    $0x451,%ax
ret
mov    $0x454,%ax
ret
mov    $0x457,%ax
ret

LLVM IR (-O0):
define zeroext i16 @cp1251towc(i8 signext %0) {
%2 = alloca i16
%3 = alloca i8
%4 = alloca i8
store i8 %0, i8* %3
%5 = load i8, i8* %3
store i8 %5, i8* %4
%6 = load i8, i8* %4
%7 = zext i8 %6 to i32
%8 = icmp sge i32 %7, 192
br i1 %8, label %9, label %15
9: ; preds = %1
%10 = load i8, i8* %4
%11 = zext i8 %10 to i32
%12 = sub nsw i32 %11, 192
%13 = add nsw i32 1040, %12
%14 = trunc i32 %13 to i16
store i16 %14, i16* %2
br label %78
15: ; preds = %1
%16 = load i8, i8* %4
%17 = zext i8 %16 to i32
%18 = icmp eq i32 %17, 168
br i1 %18, label %19, label %20
19: ; preds = %15
store i16 1025, i16* %2
br label %78
20: ; preds = %15
%21 = load i8, i8* %4
%22 = zext i8 %21 to i32
%23 = icmp eq i32 %22, 184
br i1 %23, label %24, label %25
24: ; preds = %20
store i16 1105, i16* %2
br label %78
25: ; preds = %20
%26 = load i8, i8* %4
%27 = zext i8 %26 to i32
%28 = icmp eq i32 %27, 170
br i1 %28, label %29, label %30
29: ; preds = %25
store i16 1028, i16* %2
br label %78
30: ; preds = %25
%31 = load i8, i8* %4
%32 = zext i8 %31 to i32
%33 = icmp eq i32 %32, 186
br i1 %33, label %34, label %35
34: ; preds = %30
store i16 1108, i16* %2
br label %78
35: ; preds = %30
%36 = load i8, i8* %4
%37 = zext i8 %36 to i32
%38 = icmp eq i32 %37, 178
br i1 %38, label %39, label %40
39: ; preds = %35
store i16 1030, i16* %2
br label %78
40: ; preds = %35
%41 = load i8, i8* %4
%42 = zext i8 %41 to i32
%43 = icmp eq i32 %42, 179
br i1 %43, label %44, label %45
44: ; preds = %40
store i16 1110, i16* %2
br label %78
45: ; preds = %40
%46 = load i8, i8* %4
%47 = zext i8 %46 to i32
%48 = icmp eq i32 %47, 175
br i1 %48, label %49, label %50
49: ; preds = %45
store i16 1031, i16* %2
br label %78
50: ; preds = %45
%51 = load i8, i8* %4
%52 = zext i8 %51 to i32
%53 = icmp eq i32 %52, 191
br i1 %53, label %54, label %55
54: ; preds = %50
store i16 1111, i16* %2
br label %78
55: ; preds = %50
%56 = load i8, i8* %4
%57 = zext i8 %56 to i32
%58 = icmp eq i32 %57, 161
br i1 %58, label %59, label %60
59: ; preds = %55
store i16 1038, i16* %2
br label %78
60: ; preds = %55
%61 = load i8, i8* %4
%62 = zext i8 %61 to i32
%63 = icmp eq i32 %62, 162
br i1 %63, label %64, label %65
64: ; preds = %60
store i16 1118, i16* %2
br label %78
65: ; preds = %60
br label %66
66: ; preds = %65
br label %67
67: ; preds = %66
br label %68
68: ; preds = %67
br label %69
69: ; preds = %68
br label %70
70: ; preds = %69
br label %71
71: ; preds = %70
br label %72
72: ; preds = %71
br label %73
73: ; preds = %72
br label %74
74: ; preds = %73
br label %75
75: ; preds = %74
%76 = load i8, i8* %4
%77 = zext i8 %76 to i16
store i16 %77, i16* %2
br label %78
78: ; preds = %75, %64, %59, %54, %49, %44, %39, %34, %29, %24, %19, %9
%79 = load i16, i16* %2
ret i16 %79
}

LLVM IR (-O2):
define zeroext i16 @cp1251towc(i8 signext %0) {
%2 = icmp ugt i8 %0, -65
br i1 %2, label %3, label %6
3: ; preds = %1
%4 = zext i8 %0 to i16
%5 = add nuw nsw i16 %4, 848
br label %18
6: ; preds = %1
switch i8 %0, label %16 [
i8 -88, label %18
i8 -72, label %7
i8 -86, label %8
i8 -70, label %9
i8 -78, label %10
i8 -77, label %11
i8 -81, label %12
i8 -65, label %13
i8 -95, label %14
i8 -94, label %15
]
7: ; preds = %6
br label %18
8: ; preds = %6
br label %18
9: ; preds = %6
br label %18
10: ; preds = %6
br label %18
11: ; preds = %6
br label %18
12: ; preds = %6
br label %18
13: ; preds = %6
br label %18
14: ; preds = %6
br label %18
15: ; preds = %6
br label %18
16: ; preds = %6
%17 = zext i8 %0 to i16
br label %18
18: ; preds = %6, %16, %15, %14, %13, %12, %11, %10, %9, %8, %7, %3
%19 = phi i16 [ %5, %3 ], [ 1105, %7 ], [ 1028, %8 ], [ 1108, %9 ], [ 1030, %10 ], [ 1110, %11 ], [ 1031, %12 ], [ 1111, %13 ], [ 1038, %14 ], [ 1118, %15 ], [ %17, %16 ], [ 1025, %6 ]
ret i16 %19
}