int toupper(int c) {
  if ((c >= 97) && (c <= 122))
    return c - 32;
  if ((c >= 160) && (c <= 175))
    return c - 32;
  if ((c >= 224) && (c <= 239))
    return c - 80;
  if ((c == 241) || (c == 243) || (c == 245) || (c == 247))
    return c - 1;
  return c;
}


x86 assembly (clang, -O0):
<toupper>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
cmpl   $0x61,-0x8(%rbp)
jl     1129 <toupper+0x29>
cmpl   $0x7a,-0x8(%rbp)
jg     1129 <toupper+0x29>
mov    -0x8(%rbp),%eax
sub    $0x20,%eax
mov    %eax,-0x4(%rbp)
jmp    11c1 <toupper+0xc1>
cmpl   $0xa0,-0x8(%rbp)
jl     1151 <toupper+0x51>
cmpl   $0xaf,-0x8(%rbp)
jg     1151 <toupper+0x51>
mov    -0x8(%rbp),%eax
sub    $0x20,%eax
mov    %eax,-0x4(%rbp)
jmp    11c1 <toupper+0xc1>
cmpl   $0xe0,-0x8(%rbp)
jl     1179 <toupper+0x79>
cmpl   $0xef,-0x8(%rbp)
jg     1179 <toupper+0x79>
mov    -0x8(%rbp),%eax
sub    $0x50,%eax
mov    %eax,-0x4(%rbp)
jmp    11c1 <toupper+0xc1>
cmpl   $0xf1,-0x8(%rbp)
je     11ad <toupper+0xad>
cmpl   $0xf3,-0x8(%rbp)
je     11ad <toupper+0xad>
cmpl   $0xf5,-0x8(%rbp)
je     11ad <toupper+0xad>
cmpl   $0xf7,-0x8(%rbp)
jne    11bb <toupper+0xbb>
mov    -0x8(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    11c1 <toupper+0xc1>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<toupper>:
mov    %edi,%eax
lea    -0x61(%rax),%ecx
cmp    $0x19,%ecx
jbe    111f <toupper+0x1f>
mov    %eax,%ecx
and    $0xfffffff0,%ecx
cmp    $0xe0,%ecx
je     1123 <toupper+0x23>
cmp    $0xa0,%ecx
jne    1127 <toupper+0x27>
add    $0xffffffe0,%eax
ret
add    $0xffffffb0,%eax
ret
lea    -0xf1(%rax),%ecx
cmp    $0x6,%ecx
ja     1149 <toupper+0x49>
mov    $0x55,%edx
bt     %ecx,%edx
jae    1149 <toupper+0x49>
movslq %ecx,%rax
lea    0xeba(%rip),%rcx
mov    (%rcx,%rax,4),%eax
ret

LLVM IR (-O0):
define i32 @toupper(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
%5 = icmp sge i32 %4, 97
br i1 %5, label %6, label %12
6: ; preds = %1
%7 = load i32, i32* %3
%8 = icmp sle i32 %7, 122
br i1 %8, label %9, label %12
9: ; preds = %6
%10 = load i32, i32* %3
%11 = sub nsw i32 %10, 32
store i32 %11, i32* %2
br label %47
12: ; preds = %6, %1
%13 = load i32, i32* %3
%14 = icmp sge i32 %13, 160
br i1 %14, label %15, label %21
15: ; preds = %12
%16 = load i32, i32* %3
%17 = icmp sle i32 %16, 175
br i1 %17, label %18, label %21
18: ; preds = %15
%19 = load i32, i32* %3
%20 = sub nsw i32 %19, 32
store i32 %20, i32* %2
br label %47
21: ; preds = %15, %12
%22 = load i32, i32* %3
%23 = icmp sge i32 %22, 224
br i1 %23, label %24, label %30
24: ; preds = %21
%25 = load i32, i32* %3
%26 = icmp sle i32 %25, 239
br i1 %26, label %27, label %30
27: ; preds = %24
%28 = load i32, i32* %3
%29 = sub nsw i32 %28, 80
store i32 %29, i32* %2
br label %47
30: ; preds = %24, %21
%31 = load i32, i32* %3
%32 = icmp eq i32 %31, 241
br i1 %32, label %42, label %33
33: ; preds = %30
%34 = load i32, i32* %3
%35 = icmp eq i32 %34, 243
br i1 %35, label %42, label %36
36: ; preds = %33
%37 = load i32, i32* %3
%38 = icmp eq i32 %37, 245
br i1 %38, label %42, label %39
39: ; preds = %36
%40 = load i32, i32* %3
%41 = icmp eq i32 %40, 247
br i1 %41, label %42, label %45
42: ; preds = %39, %36, %33, %30
%43 = load i32, i32* %3
%44 = sub nsw i32 %43, 1
store i32 %44, i32* %2
br label %47
45: ; preds = %39
%46 = load i32, i32* %3
store i32 %46, i32* %2
br label %47
47: ; preds = %45, %42, %27, %18, %9
%48 = load i32, i32* %2
ret i32 %48
}

LLVM IR (-O2):
@switch.table.toupper = [7 x i32] [i32 240, i32 246, i32 242, i32 246, i32 244, i32 246, i32 246]
define i32 @toupper(i32 %0) {
%2 = add i32 %0, -97
%3 = icmp ult i32 %2, 26
br i1 %3, label %4, label %6
4: ; preds = %1
%5 = add nsw i32 %0, -32
br label %24
6: ; preds = %1
%7 = and i32 %0, -16
switch i32 %7, label %12 [
i32 160, label %8
i32 224, label %10
]
8: ; preds = %6
%9 = add nsw i32 %0, -32
br label %24
10: ; preds = %6
%11 = add nsw i32 %0, -80
br label %24
12: ; preds = %6
%13 = add i32 %0, -241
%14 = icmp ult i32 %13, 7
br i1 %14, label %15, label %24
15: ; preds = %12
%16 = trunc i32 %13 to i8
%17 = lshr i8 85, %16
%18 = and i8 %17, 1
%19 = icmp eq i8 %18, 0
br i1 %19, label %24, label %20
20: ; preds = %15
%21 = sext i32 %13 to i64
%22 = getelementptr inbounds [7 x i32], [7 x i32]* @switch.table.toupper, i64 0, i64 %21
%23 = load i32, i32* %22
br label %24
24: ; preds = %20, %15, %12, %10, %8, %4
%25 = phi i32 [ %5, %4 ], [ %9, %8 ], [ %11, %10 ], [ %0, %12 ], [ %0, %15 ], [ %23, %20 ]
ret i32 %25
}