#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
void memcpy_lc(char *restrict dst, const char *restrict src, size_t n) {
  while (n-- > 0) {
    char c = *(src++);
    if (c >= 'A' && c <= 'Z')
      c += 'a' - 'A';
    *(dst++) = c;
  }
}


x86 assembly (clang, -O0):
<memcpy_lc>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x18(%rbp)
cmp    $0x0,%rax
jbe    117a <memcpy_lc+0x7a>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
mov    (%rax),%al
mov    %al,-0x19(%rbp)
movsbl -0x19(%rbp),%eax
cmp    $0x41,%eax
jl     1161 <memcpy_lc+0x61>
movsbl -0x19(%rbp),%eax
cmp    $0x5a,%eax
jg     1161 <memcpy_lc+0x61>
movsbl -0x19(%rbp),%eax
add    $0x20,%eax
mov    %al,-0x19(%rbp)
mov    -0x19(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cl,(%rax)
jmp    1110 <memcpy_lc+0x10>
pop    %rbp
ret

x86 assembly (clang, -O2):
<memcpy_lc>:
test   %rdx,%rdx
je     1383 <memcpy_lc+0x283>
cmp    $0x8,%rdx
jae    111d <memcpy_lc+0x1d>
mov    %rdx,%r8
mov    %rsi,%r9
mov    %rdi,%rcx
jmp    1350 <memcpy_lc+0x250>
cmp    $0x20,%rdx
jae    112a <memcpy_lc+0x2a>
xor    %eax,%eax
jmp    12d6 <memcpy_lc+0x1d6>
mov    %rdx,%rax
and    $0xffffffffffffffe0,%rax
lea    -0x20(%rax),%rcx
mov    %rcx,%r8
shr    $0x5,%r8
add    $0x1,%r8
test   %rcx,%rcx
je     1384 <memcpy_lc+0x284>
mov    %r8,%r9
and    $0xfffffffffffffffe,%r9
xor    %ecx,%ecx
movdqa 0xea6(%rip),%xmm0
movdqa 0xeae(%rip),%xmm1
movdqa 0xeb6(%rip),%xmm2
nopw   0x0(%rax,%rax,1)
movdqu (%rsi,%rcx,1),%xmm3
movdqu 0x10(%rsi,%rcx,1),%xmm4
movdqa %xmm3,%xmm5
paddb  %xmm0,%xmm5
movdqa %xmm4,%xmm6
paddb  %xmm0,%xmm6
movdqa %xmm5,%xmm7
pminub %xmm1,%xmm7
pcmpeqb %xmm5,%xmm7
movdqa %xmm6,%xmm5
pminub %xmm1,%xmm5
pcmpeqb %xmm6,%xmm5
movdqa %xmm7,%xmm6
pandn  %xmm3,%xmm6
paddb  %xmm2,%xmm3
pand   %xmm7,%xmm3
por    %xmm6,%xmm3
movdqa %xmm5,%xmm6
pandn  %xmm4,%xmm6
paddb  %xmm2,%xmm4
pand   %xmm5,%xmm4
por    %xmm6,%xmm4
movdqu %xmm3,(%rdi,%rcx,1)
movdqu %xmm4,0x10(%rdi,%rcx,1)
movdqu 0x20(%rsi,%rcx,1),%xmm3
movdqu 0x30(%rsi,%rcx,1),%xmm4
movdqa %xmm3,%xmm5
paddb  %xmm0,%xmm5
movdqa %xmm4,%xmm6
paddb  %xmm0,%xmm6
movdqa %xmm5,%xmm7
pminub %xmm1,%xmm7
pcmpeqb %xmm5,%xmm7
movdqa %xmm6,%xmm5
pminub %xmm1,%xmm5
pcmpeqb %xmm6,%xmm5
movdqa %xmm7,%xmm6
pandn  %xmm3,%xmm6
paddb  %xmm2,%xmm3
pand   %xmm7,%xmm3
por    %xmm6,%xmm3
movdqa %xmm5,%xmm6
pandn  %xmm4,%xmm6
paddb  %xmm2,%xmm4
pand   %xmm5,%xmm4
por    %xmm6,%xmm4
movdqu %xmm3,0x20(%rdi,%rcx,1)
movdqu %xmm4,0x30(%rdi,%rcx,1)
add    $0x40,%rcx
add    $0xfffffffffffffffe,%r9
jne    1170 <memcpy_lc+0x70>
test   $0x1,%r8b
je     12c4 <memcpy_lc+0x1c4>
movdqu (%rsi,%rcx,1),%xmm0
movdqu 0x10(%rsi,%rcx,1),%xmm1
movdqa 0xd9b(%rip),%xmm2
movdqa %xmm0,%xmm3
paddb  %xmm2,%xmm3
paddb  %xmm1,%xmm2
movdqa 0xd97(%rip),%xmm4
movdqa %xmm3,%xmm5
pminub %xmm4,%xmm5
pcmpeqb %xmm3,%xmm5
pminub %xmm2,%xmm4
pcmpeqb %xmm2,%xmm4
movdqa 0xd8b(%rip),%xmm2
movdqa %xmm5,%xmm3
pandn  %xmm0,%xmm3
paddb  %xmm2,%xmm0
paddb  %xmm1,%xmm2
pand   %xmm5,%xmm0
por    %xmm3,%xmm0
pand   %xmm4,%xmm2
pandn  %xmm1,%xmm4
por    %xmm2,%xmm4
movdqu %xmm0,(%rdi,%rcx,1)
movdqu %xmm4,0x10(%rdi,%rcx,1)
cmp    %rdx,%rax
je     1383 <memcpy_lc+0x283>
test   $0x18,%dl
je     1395 <memcpy_lc+0x295>
mov    %rdx,%r10
and    $0xfffffffffffffff8,%r10
mov    %edx,%r8d
and    $0x7,%r8d
lea    (%rsi,%r10,1),%r9
lea    (%rdi,%r10,1),%rcx
movdqa 0xd3c(%rip),%xmm0
movdqa 0xd44(%rip),%xmm1
movdqa 0xd4c(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movq   (%rsi,%rax,1),%xmm3
movdqa %xmm3,%xmm4
paddb  %xmm0,%xmm4
movdqa %xmm4,%xmm5
pmaxub %xmm1,%xmm5
pcmpeqb %xmm4,%xmm5
movdqa %xmm5,%xmm4
pand   %xmm3,%xmm4
paddb  %xmm2,%xmm3
pandn  %xmm3,%xmm5
por    %xmm4,%xmm5
movq   %xmm5,(%rdi,%rax,1)
add    $0x8,%rax
cmp    %rax,%r10
jne    1310 <memcpy_lc+0x210>
cmp    %rdx,%r10
je     1383 <memcpy_lc+0x283>
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl (%r9,%rax,1),%edx
lea    -0x41(%rdx),%esi
lea    0x20(%rdx),%edi
cmp    $0x1a,%sil
movzbl %dil,%esi
cmovae %edx,%esi
mov    %sil,(%rcx,%rax,1)
add    $0x1,%rax
cmp    %rax,%r8
jne    1360 <memcpy_lc+0x260>
ret
xor    %ecx,%ecx
test   $0x1,%r8b
jne    1252 <memcpy_lc+0x152>
jmp    12c4 <memcpy_lc+0x1c4>
add    %rax,%rdi
add    %rax,%rsi
and    $0x1f,%edx
jmp    110f <memcpy_lc+0xf>

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

LLVM IR (-O2):
define void @memcpy_lc(i8* noalias nocapture writeonly %0, i8* noalias nocapture %1, i64 %2) {
%4 = icmp eq i64 %2, 0
br i1 %4, label %129, label %5
5: ; preds = %3
%6 = icmp ult i64 %2, 8
br i1 %6, label %112, label %7
7: ; preds = %5
%8 = icmp ult i64 %2, 32
br i1 %8, label %91, label %9
9: ; preds = %7
%10 = and i64 %2, -32
%11 = add i64 %10, -32
%12 = lshr exact i64 %11, 5
%13 = add nuw nsw i64 %12, 1
%14 = and i64 %13, 1
%15 = icmp eq i64 %11, 0
br i1 %15, label %61, label %16
16: ; preds = %9
%17 = and i64 %13, 1152921504606846974
br label %18
18: ; preds = %18, %16
%19 = phi i64 [ 0, %16 ], [ %58, %18 ]
%20 = phi i64 [ 0, %16 ], [ %59, %18 ]
%21 = getelementptr i8, i8* %1, i64 %19
%22 = getelementptr i8, i8* %0, i64 %19
%23 = bitcast i8* %21 to <16 x i8>*
%24 = load <16 x i8>, <16 x i8>* %23
%25 = getelementptr i8, i8* %21, i64 16
%26 = bitcast i8* %25 to <16 x i8>*
%27 = load <16 x i8>, <16 x i8>* %26
%28 = add <16 x i8> %24, <i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65>
%29 = add <16 x i8> %27, <i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65>
%30 = icmp ult <16 x i8> %28, <i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26>
%31 = icmp ult <16 x i8> %29, <i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26>
%32 = add <16 x i8> %24, <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%33 = add <16 x i8> %27, <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%34 = select <16 x i1> %30, <16 x i8> %32, <16 x i8> %24
%35 = select <16 x i1> %31, <16 x i8> %33, <16 x i8> %27
%36 = bitcast i8* %22 to <16 x i8>*
store <16 x i8> %34, <16 x i8>* %36
%37 = getelementptr i8, i8* %22, i64 16
%38 = bitcast i8* %37 to <16 x i8>*
store <16 x i8> %35, <16 x i8>* %38
%39 = or i64 %19, 32
%40 = getelementptr i8, i8* %1, i64 %39
%41 = getelementptr i8, i8* %0, i64 %39
%42 = bitcast i8* %40 to <16 x i8>*
%43 = load <16 x i8>, <16 x i8>* %42
%44 = getelementptr i8, i8* %40, i64 16
%45 = bitcast i8* %44 to <16 x i8>*
%46 = load <16 x i8>, <16 x i8>* %45
%47 = add <16 x i8> %43, <i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65>
%48 = add <16 x i8> %46, <i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65>
%49 = icmp ult <16 x i8> %47, <i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26>
%50 = icmp ult <16 x i8> %48, <i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26>
%51 = add <16 x i8> %43, <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%52 = add <16 x i8> %46, <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%53 = select <16 x i1> %49, <16 x i8> %51, <16 x i8> %43
%54 = select <16 x i1> %50, <16 x i8> %52, <16 x i8> %46
%55 = bitcast i8* %41 to <16 x i8>*
store <16 x i8> %53, <16 x i8>* %55
%56 = getelementptr i8, i8* %41, i64 16
%57 = bitcast i8* %56 to <16 x i8>*
store <16 x i8> %54, <16 x i8>* %57
%58 = add nuw i64 %19, 64
%59 = add i64 %20, 2
%60 = icmp eq i64 %59, %17
br i1 %60, label %61, label %18
61: ; preds = %18, %9
%62 = phi i64 [ 0, %9 ], [ %58, %18 ]
%63 = icmp eq i64 %14, 0
br i1 %63, label %83, label %64
64: ; preds = %61
%65 = getelementptr i8, i8* %1, i64 %62
%66 = getelementptr i8, i8* %0, i64 %62
%67 = bitcast i8* %65 to <16 x i8>*
%68 = load <16 x i8>, <16 x i8>* %67
%69 = getelementptr i8, i8* %65, i64 16
%70 = bitcast i8* %69 to <16 x i8>*
%71 = load <16 x i8>, <16 x i8>* %70
%72 = add <16 x i8> %68, <i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65>
%73 = add <16 x i8> %71, <i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65>
%74 = icmp ult <16 x i8> %72, <i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26>
%75 = icmp ult <16 x i8> %73, <i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26>
%76 = add <16 x i8> %68, <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%77 = add <16 x i8> %71, <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%78 = select <16 x i1> %74, <16 x i8> %76, <16 x i8> %68
%79 = select <16 x i1> %75, <16 x i8> %77, <16 x i8> %71
%80 = bitcast i8* %66 to <16 x i8>*
store <16 x i8> %78, <16 x i8>* %80
%81 = getelementptr i8, i8* %66, i64 16
%82 = bitcast i8* %81 to <16 x i8>*
store <16 x i8> %79, <16 x i8>* %82
br label %83
83: ; preds = %61, %64
%84 = icmp eq i64 %10, %2
br i1 %84, label %129, label %85
85: ; preds = %83
%86 = getelementptr i8, i8* %0, i64 %10
%87 = getelementptr i8, i8* %1, i64 %10
%88 = and i64 %2, 31
%89 = and i64 %2, 24
%90 = icmp eq i64 %89, 0
br i1 %90, label %112, label %91
91: ; preds = %7, %85
%92 = phi i64 [ %10, %85 ], [ 0, %7 ]
%93 = and i64 %2, -8
%94 = and i64 %2, 7
%95 = getelementptr i8, i8* %1, i64 %93
%96 = getelementptr i8, i8* %0, i64 %93
br label %97
97: ; preds = %97, %91
%98 = phi i64 [ %92, %91 ], [ %108, %97 ]
%99 = getelementptr i8, i8* %1, i64 %98
%100 = getelementptr i8, i8* %0, i64 %98
%101 = bitcast i8* %99 to <8 x i8>*
%102 = load <8 x i8>, <8 x i8>* %101
%103 = add <8 x i8> %102, <i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65, i8 -65>
%104 = icmp ult <8 x i8> %103, <i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26, i8 26>
%105 = add <8 x i8> %102, <i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32, i8 32>
%106 = select <8 x i1> %104, <8 x i8> %105, <8 x i8> %102
%107 = bitcast i8* %100 to <8 x i8>*
store <8 x i8> %106, <8 x i8>* %107
%108 = add nuw i64 %98, 8
%109 = icmp eq i64 %108, %93
br i1 %109, label %110, label %97
110: ; preds = %97
%111 = icmp eq i64 %93, %2
br i1 %111, label %129, label %112
112: ; preds = %5, %85, %110
%113 = phi i64 [ %2, %5 ], [ %88, %85 ], [ %94, %110 ]
%114 = phi i8* [ %1, %5 ], [ %87, %85 ], [ %95, %110 ]
%115 = phi i8* [ %0, %5 ], [ %86, %85 ], [ %96, %110 ]
br label %116
116: ; preds = %112, %116
%117 = phi i64 [ %120, %116 ], [ %113, %112 ]
%118 = phi i8* [ %121, %116 ], [ %114, %112 ]
%119 = phi i8* [ %127, %116 ], [ %115, %112 ]
%120 = add i64 %117, -1
%121 = getelementptr inbounds i8, i8* %118, i64 1
%122 = load i8, i8* %118
%123 = add i8 %122, -65
%124 = icmp ult i8 %123, 26
%125 = add i8 %122, 32
%126 = select i1 %124, i8 %125, i8 %122
%127 = getelementptr inbounds i8, i8* %119, i64 1
store i8 %126, i8* %119
%128 = icmp eq i64 %120, 0
br i1 %128, label %129, label %116
129: ; preds = %116, %83, %110, %3
ret void
}