void toLower(char string[], int len) {
  short i;
  for (i = 0; i < len; i++) {
    if (string[i] >= 'A' && string[i] <= 'Z')
      string[i] += 32;
  }
}


x86 assembly (clang, -O0):
<toLower>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movw   $0x0,-0xe(%rbp)
movswl -0xe(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1173 <toLower+0x73>
mov    -0x8(%rbp),%rax
movswq -0xe(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x41,%eax
jl     115d <toLower+0x5d>
mov    -0x8(%rbp),%rax
movswq -0xe(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5a,%eax
jg     115d <toLower+0x5d>
mov    -0x8(%rbp),%rax
movswq -0xe(%rbp),%rcx
movsbl (%rax,%rcx,1),%edx
add    $0x20,%edx
mov    %dl,(%rax,%rcx,1)
jmp    1162 <toLower+0x62>
mov    -0xe(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0xe(%rbp)
jmp    1111 <toLower+0x11>
pop    %rbp
ret

x86 assembly (clang, -O2):
<toLower>:
test   %esi,%esi
jle    128a <toLower+0x18a>
cmp    $0x8,%esi
jae    1114 <toLower+0x14>
xor    %eax,%eax
jmp    129a <toLower+0x19a>
lea    -0x1(%rsi),%ecx
movzwl %cx,%edx
xor    %eax,%eax
cmp    $0x7ffe,%edx
ja     129a <toLower+0x19a>
cmp    $0x7fff,%ecx
ja     129a <toLower+0x19a>
mov    %esi,%eax
and    $0xfffffff8,%eax
mov    %esi,%r8d
and    $0xfffffff8,%r8d
xor    %edx,%edx
movdqa 0xeb6(%rip),%xmm0
movdqa 0xebe(%rip),%xmm1
pcmpeqd %xmm2,%xmm2
jmp    116d <toLower+0x6d>
nopl   0x0(%rax,%rax,1)
add    $0x8,%rdx
cmp    %edx,%r8d
je     1286 <toLower+0x186>
movq   (%rdi,%rdx,1),%xmm3
movdqa %xmm3,%xmm4
paddb  %xmm0,%xmm4
movdqa %xmm4,%xmm5
pmaxub %xmm1,%xmm5
pcmpeqb %xmm4,%xmm5
movd   %xmm5,%ecx
not    %cl
test   $0x1,%cl
je     119b <toLower+0x9b>
movd   %xmm3,%ecx
add    $0x20,%cl
mov    %cl,(%rdi,%rdx,1)
movdqa %xmm5,%xmm4
pxor   %xmm2,%xmm4
movdqa %xmm4,%xmm6
pslld  $0x8,%xmm6
movd   %xmm6,%ecx
shr    $0x10,%ecx
test   $0x1,%cl
je     11c6 <toLower+0xc6>
movd   %xmm3,%ecx
shr    $0x8,%ecx
add    $0x20,%cl
mov    %cl,0x1(%rdi,%rdx,1)
pshuflw $0x55,%xmm5,%xmm6
pxor   %xmm2,%xmm6
pextrw $0x2,%xmm6,%ecx
test   $0x1,%cl
je     11e7 <toLower+0xe7>
movd   %xmm3,%ecx
shr    $0x10,%ecx
add    $0x20,%cl
mov    %cl,0x2(%rdi,%rdx,1)
movdqa %xmm4,%xmm6
psllq  $0x18,%xmm6
pextrw $0x3,%xmm6,%ecx
test   $0x1,%cl
je     1208 <toLower+0x108>
movd   %xmm3,%ecx
shr    $0x18,%ecx
add    $0x20,%cl
mov    %cl,0x3(%rdi,%rdx,1)
pshufd $0x55,%xmm5,%xmm5
pxor   %xmm2,%xmm5
pextrw $0x4,%xmm5,%ecx
test   $0x1,%cl
je     1227 <toLower+0x127>
pextrw $0x2,%xmm3,%ecx
add    $0x20,%cl
mov    %cl,0x4(%rdi,%rdx,1)
movdqa %xmm4,%xmm5
pslldq $0x5,%xmm5
pextrw $0x5,%xmm5,%ecx
test   $0x1,%cl
je     1249 <toLower+0x149>
pextrw $0x2,%xmm3,%ecx
shr    $0x8,%ecx
add    $0x20,%cl
mov    %cl,0x5(%rdi,%rdx,1)
pextrw $0x3,%xmm4,%ecx
test   $0x1,%cl
je     125f <toLower+0x15f>
pextrw $0x3,%xmm3,%ecx
add    $0x20,%cl
mov    %cl,0x6(%rdi,%rdx,1)
pslldq $0x7,%xmm4
pextrw $0x7,%xmm4,%ecx
test   $0x1,%cl
je     1160 <toLower+0x60>
pextrw $0x3,%xmm3,%ecx
shr    $0x8,%ecx
add    $0x20,%cl
mov    %cl,0x7(%rdi,%rdx,1)
jmp    1160 <toLower+0x60>
cmp    %esi,%eax
jne    129a <toLower+0x19a>
ret
nopl   0x0(%rax,%rax,1)
add    $0x1,%eax
movswl %ax,%ecx
cmp    %esi,%ecx
jge    128a <toLower+0x18a>
movswq %ax,%rax
movzbl (%rdi,%rax,1),%ecx
lea    -0x41(%rcx),%edx
cmp    $0x19,%dl
ja     1290 <toLower+0x190>
add    $0x20,%cl
mov    %cl,(%rdi,%rax,1)
jmp    1290 <toLower+0x190>

LLVM IR (-O0):
define void @toLower(i8* %0, i32 %1) {
%3 = alloca i8*
%4 = alloca i32
%5 = alloca i16
store i8* %0, i8** %3
store i32 %1, i32* %4
store i16 0, i16* %5
br label %6
6: ; preds = %37, %2
%7 = load i16, i16* %5
%8 = sext i16 %7 to i32
%9 = load i32, i32* %4
%10 = icmp slt i32 %8, %9
br i1 %10, label %11, label %40
11: ; preds = %6
%12 = load i8*, i8** %3
%13 = load i16, i16* %5
%14 = sext i16 %13 to i64
%15 = getelementptr inbounds i8, i8* %12, i64 %14
%16 = load i8, i8* %15
%17 = sext i8 %16 to i32
%18 = icmp sge i32 %17, 65
br i1 %18, label %19, label %36
19: ; preds = %11
%20 = load i8*, i8** %3
%21 = load i16, i16* %5
%22 = sext i16 %21 to i64
%23 = getelementptr inbounds i8, i8* %20, i64 %22
%24 = load i8, i8* %23
%25 = sext i8 %24 to i32
%26 = icmp sle i32 %25, 90
br i1 %26, label %27, label %36
27: ; preds = %19
%28 = load i8*, i8** %3
%29 = load i16, i16* %5
%30 = sext i16 %29 to i64
%31 = getelementptr inbounds i8, i8* %28, i64 %30
%32 = load i8, i8* %31
%33 = sext i8 %32 to i32
%34 = add nsw i32 %33, 32
%35 = trunc i32 %34 to i8
store i8 %35, i8* %31
br label %36
36: ; preds = %27, %19, %11
br label %37
37: ; preds = %36
%38 = load i16, i16* %5
%39 = add i16 %38, 1
store i16 %39, i16* %5
br label %6
40: ; preds = %6
ret void
}

LLVM IR (-O2):
define void @toLower(i8* nocapture %0, i32 %1) {
%3 = icmp sgt i32 %1, 0
br i1 %3, label %4, label %105
4: ; preds = %2
%5 = icmp ult i32 %1, 8
br i1 %5, label %90, label %6
6: ; preds = %4
%7 = add i32 %1, -1
%8 = trunc i32 %7 to i16
%9 = icmp ugt i16 %8, 32766
%10 = icmp ugt i32 %7, 32767
%11 = or i1 %9, %10
br i1 %11, label %90, label %12
12: ; preds = %6
%13 = and i32 %1, -8
%14 = trunc i32 %13 to i16
br label %15
15: ; preds = %85, %12
%16 = phi i32 [ 0, %12 ], [ %86, %85 ]
%17 = trunc i32 %16 to i16
%18 = or i16 %17, 1
%19 = or i16 %17, 2
%20 = or i16 %17, 3
%21 = or i16 %17, 4
%22 = or i16 %17, 5
%23 = or i16 %17, 6
%24 = or i16 %17, 7
%25 = sext i16 %17 to i64
%26 = getelementptr inbounds i8, i8* %0, i64 %25
%27 = bitcast i8* %26 to <8 x i8>*
%28 = load <8 x i8>, <8 x i8>* %27
%29 = add <8 x i8> %28, <i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65>
%30 = icmp ult <8 x i8> %29, <i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26>
%31 = extractelement <8 x i1> %30, i64 0
br i1 %31, label %32, label %36
32: ; preds = %15
%33 = extractelement <8 x i8> %28, i64 0
%34 = add nuw nsw i8 %33, 32
%35 = getelementptr inbounds i8, i8* %0, i64 %25
store i8 %34, i8* %35
br label %36
36: ; preds = %32, %15
%37 = extractelement <8 x i1> %30, i64 1
br i1 %37, label %38, label %43
38: ; preds = %36
%39 = sext i16 %18 to i64
%40 = extractelement <8 x i8> %28, i64 1
%41 = add nuw nsw i8 %40, 32
%42 = getelementptr inbounds i8, i8* %0, i64 %39
store i8 %41, i8* %42
br label %43
43: ; preds = %38, %36
%44 = extractelement <8 x i1> %30, i64 2
br i1 %44, label %45, label %50
45: ; preds = %43
%46 = sext i16 %19 to i64
%47 = extractelement <8 x i8> %28, i64 2
%48 = add nuw nsw i8 %47, 32
%49 = getelementptr inbounds i8, i8* %0, i64 %46
store i8 %48, i8* %49
br label %50
50: ; preds = %45, %43
%51 = extractelement <8 x i1> %30, i64 3
br i1 %51, label %52, label %57
52: ; preds = %50
%53 = sext i16 %20 to i64
%54 = extractelement <8 x i8> %28, i64 3
%55 = add nuw nsw i8 %54, 32
%56 = getelementptr inbounds i8, i8* %0, i64 %53
store i8 %55, i8* %56
br label %57
57: ; preds = %52, %50
%58 = extractelement <8 x i1> %30, i64 4
br i1 %58, label %59, label %64
59: ; preds = %57
%60 = sext i16 %21 to i64
%61 = extractelement <8 x i8> %28, i64 4
%62 = add nuw nsw i8 %61, 32
%63 = getelementptr inbounds i8, i8* %0, i64 %60
store i8 %62, i8* %63
br label %64
64: ; preds = %59, %57
%65 = extractelement <8 x i1> %30, i64 5
br i1 %65, label %66, label %71
66: ; preds = %64
%67 = sext i16 %22 to i64
%68 = extractelement <8 x i8> %28, i64 5
%69 = add nuw nsw i8 %68, 32
%70 = getelementptr inbounds i8, i8* %0, i64 %67
store i8 %69, i8* %70
br label %71
71: ; preds = %66, %64
%72 = extractelement <8 x i1> %30, i64 6
br i1 %72, label %73, label %78
73: ; preds = %71
%74 = sext i16 %23 to i64
%75 = extractelement <8 x i8> %28, i64 6
%76 = add nuw nsw i8 %75, 32
%77 = getelementptr inbounds i8, i8* %0, i64 %74
store i8 %76, i8* %77
br label %78
78: ; preds = %73, %71
%79 = extractelement <8 x i1> %30, i64 7
br i1 %79, label %80, label %85
80: ; preds = %78
%81 = sext i16 %24 to i64
%82 = extractelement <8 x i8> %28, i64 7
%83 = add nuw nsw i8 %82, 32
%84 = getelementptr inbounds i8, i8* %0, i64 %81
store i8 %83, i8* %84
br label %85
85: ; preds = %80, %78
%86 = add nuw i32 %16, 8
%87 = icmp eq i32 %86, %13
br i1 %87, label %88, label %15
88: ; preds = %85
%89 = icmp eq i32 %13, %1
br i1 %89, label %105, label %90
90: ; preds = %6, %4, %88
%91 = phi i16 [ 0, %6 ], [ 0, %4 ], [ %14, %88 ]
br label %92
92: ; preds = %90, %101
%93 = phi i16 [ %102, %101 ], [ %91, %90 ]
%94 = sext i16 %93 to i64
%95 = getelementptr inbounds i8, i8* %0, i64 %94
%96 = load i8, i8* %95
%97 = add i8 %96, -65
%98 = icmp ult i8 %97, 26
br i1 %98, label %99, label %101
99: ; preds = %92
%100 = add nuw nsw i8 %96, 32
store i8 %100, i8* %95
br label %101
101: ; preds = %92, %99
%102 = add i16 %93, 1
%103 = sext i16 %102 to i32
%104 = icmp slt i32 %103, %1
br i1 %104, label %92, label %105
105: ; preds = %101, %88, %2
ret void
}