int tolower(int c) {
  if ((c >= 65) && (c <= 90))
    return c + 32;
  if ((c >= 128) && (c <= 143))
    return c + 32;
  if ((c >= 144) && (c <= 159))
    return c + 80;
  if ((c == 240) || (c == 242) || (c == 244) || (c == 246))
    return c + 1;
  return c;
}


x86 assembly (clang, -O0):
<tolower>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
cmpl   $0x41,-0x8(%rbp)
jl     1129 <tolower+0x29>
cmpl   $0x5a,-0x8(%rbp)
jg     1129 <tolower+0x29>
mov    -0x8(%rbp),%eax
add    $0x20,%eax
mov    %eax,-0x4(%rbp)
jmp    11c1 <tolower+0xc1>
cmpl   $0x80,-0x8(%rbp)
jl     1151 <tolower+0x51>
cmpl   $0x8f,-0x8(%rbp)
jg     1151 <tolower+0x51>
mov    -0x8(%rbp),%eax
add    $0x20,%eax
mov    %eax,-0x4(%rbp)
jmp    11c1 <tolower+0xc1>
cmpl   $0x90,-0x8(%rbp)
jl     1179 <tolower+0x79>
cmpl   $0x9f,-0x8(%rbp)
jg     1179 <tolower+0x79>
mov    -0x8(%rbp),%eax
add    $0x50,%eax
mov    %eax,-0x4(%rbp)
jmp    11c1 <tolower+0xc1>
cmpl   $0xf0,-0x8(%rbp)
je     11ad <tolower+0xad>
cmpl   $0xf2,-0x8(%rbp)
je     11ad <tolower+0xad>
cmpl   $0xf4,-0x8(%rbp)
je     11ad <tolower+0xad>
cmpl   $0xf6,-0x8(%rbp)
jne    11bb <tolower+0xbb>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4(%rbp)
jmp    11c1 <tolower+0xc1>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<tolower>:
mov    %edi,%eax
lea    -0x41(%rax),%ecx
cmp    $0x19,%ecx
jbe    111f <tolower+0x1f>
mov    %eax,%ecx
and    $0xfffffff0,%ecx
cmp    $0x90,%ecx
je     1123 <tolower+0x23>
cmp    $0x80,%ecx
jne    1127 <tolower+0x27>
add    $0x20,%eax
ret
add    $0x50,%eax
ret
lea    -0xf0(%rax),%ecx
cmp    $0x6,%ecx
ja     1149 <tolower+0x49>
mov    $0x55,%edx
bt     %ecx,%edx
jae    1149 <tolower+0x49>
movslq %ecx,%rax
lea    0xeba(%rip),%rcx
mov    (%rcx,%rax,4),%eax
ret

LLVM IR (-O0):
define i32 @tolower(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
%5 = icmp sge i32 %4, 65
br i1 %5, label %6, label %12
6: ; preds = %1
%7 = load i32, i32* %3
%8 = icmp sle i32 %7, 90
br i1 %8, label %9, label %12
9: ; preds = %6
%10 = load i32, i32* %3
%11 = add 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, 128
br i1 %14, label %15, label %21
15: ; preds = %12
%16 = load i32, i32* %3
%17 = icmp sle i32 %16, 143
br i1 %17, label %18, label %21
18: ; preds = %15
%19 = load i32, i32* %3
%20 = add 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, 144
br i1 %23, label %24, label %30
24: ; preds = %21
%25 = load i32, i32* %3
%26 = icmp sle i32 %25, 159
br i1 %26, label %27, label %30
27: ; preds = %24
%28 = load i32, i32* %3
%29 = add 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, 240
br i1 %32, label %42, label %33
33: ; preds = %30
%34 = load i32, i32* %3
%35 = icmp eq i32 %34, 242
br i1 %35, label %42, label %36
36: ; preds = %33
%37 = load i32, i32* %3
%38 = icmp eq i32 %37, 244
br i1 %38, label %42, label %39
39: ; preds = %36
%40 = load i32, i32* %3
%41 = icmp eq i32 %40, 246
br i1 %41, label %42, label %45
42: ; preds = %39, %36, %33, %30
%43 = load i32, i32* %3
%44 = add 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.tolower = [7 x i32] [i32 241, i32 247, i32 243, i32 247, i32 245, i32 247, i32 247]
define i32 @tolower(i32 %0) {
%2 = add i32 %0, -65
%3 = icmp ult i32 %2, 26
br i1 %3, label %4, label %6
4: ; preds = %1
%5 = add nuw nsw i32 %0, 32
br label %24
6: ; preds = %1
%7 = and i32 %0, -16
switch i32 %7, label %12 [
i32 128, label %8
i32 144, label %10
]
8: ; preds = %6
%9 = add nuw nsw i32 %0, 32
br label %24
10: ; preds = %6
%11 = add nuw nsw i32 %0, 80
br label %24
12: ; preds = %6
%13 = add i32 %0, -240
%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.tolower, 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
}