void v4lconvert_rotate180_yuv420(const unsigned char *src, unsigned char *dst,
                                 int width, int height) {
  int i;
  src += width * height - 1;
  for (i = 0; i < width * height; i++)
    *dst++ = *src--;
  src += width * height * 5 / 4;
  for (i = 0; i < width * height / 4; i++)
    *dst++ = *src--;
  src += width * height / 2;
  for (i = 0; i < width * height / 4; i++)
    *dst++ = *src--;
}


x86 assembly (clang, -O0):
<v4lconvert_rotate180_yuv420>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    -0x14(%rbp),%ecx
imul   -0x18(%rbp),%ecx
sub    $0x1,%ecx
mov    -0x8(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    -0x14(%rbp),%ecx
imul   -0x18(%rbp),%ecx
cmp    %ecx,%eax
jge    1173 <v4lconvert_rotate180_yuv420+0x73>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1131 <v4lconvert_rotate180_yuv420+0x31>
mov    -0x14(%rbp),%eax
imul   -0x18(%rbp),%eax
imul   $0x5,%eax,%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x20(%rbp)
mov    -0x14(%rbp),%eax
imul   -0x18(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x20(%rbp),%eax
cmp    %ecx,%eax
jge    11ee <v4lconvert_rotate180_yuv420+0xee>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    119c <v4lconvert_rotate180_yuv420+0x9c>
mov    -0x14(%rbp),%eax
imul   -0x18(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x8(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x8(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x24(%rbp)
mov    -0x14(%rbp),%eax
imul   -0x18(%rbp),%eax
mov    $0x4,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x24(%rbp),%eax
cmp    %ecx,%eax
jge    1266 <v4lconvert_rotate180_yuv420+0x166>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0xffffffffffffffff,%rcx
mov    %rcx,-0x8(%rbp)
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1214 <v4lconvert_rotate180_yuv420+0x114>
pop    %rbp
ret

x86 assembly (clang, -O2):
<v4lconvert_rotate180_yuv420>:
push   %r15
push   %r14
push   %rbx
imul   %ecx,%edx
test   %edx,%edx
jle    154a <v4lconvert_rotate180_yuv420+0x44a>
lea    -0x1(%rdx),%eax
movslq %eax,%rbx
lea    (%rdi,%rbx,1),%r15
xor    %r8d,%r8d
cmp    $0x1f,%ebx
jb     1157 <v4lconvert_rotate180_yuv420+0x57>
mov    %ebx,%r9d
lea    (%rbx,%rdi,1),%rcx
add    $0x1,%rcx
cmp    %rsi,%rcx
jbe    11f0 <v4lconvert_rotate180_yuv420+0xf0>
lea    (%r9,%rsi,1),%r10
add    $0x1,%r10
movabs $0xffffffff00000000,%rcx
ff ff ff
and    %rbx,%rcx
add    %rdi,%rcx
cmp    %r10,%rcx
jae    11f0 <v4lconvert_rotate180_yuv420+0xf0>
mov    %rsi,%rcx
mov    %edx,%edi
sub    %r8d,%edi
mov    %r8d,%esi
not    %esi
add    %edx,%esi
and    $0x7,%edi
je     1189 <v4lconvert_rotate180_yuv420+0x89>
neg    %edi
xor    %ebx,%ebx
nop
movzbl (%r15,%rbx,1),%eax
mov    %al,(%rcx)
add    $0x1,%rcx
add    $0xffffffffffffffff,%rbx
cmp    %ebx,%edi
jne    1170 <v4lconvert_rotate180_yuv420+0x70>
sub    %ebx,%r8d
add    %rbx,%r15
cmp    $0x7,%esi
jb     12a6 <v4lconvert_rotate180_yuv420+0x1a6>
mov    %edx,%esi
sub    %r8d,%esi
nopw   0x0(%rax,%rax,1)
movzbl (%r15),%eax
mov    %al,(%rcx)
movzbl -0x1(%r15),%eax
mov    %al,0x1(%rcx)
movzbl -0x2(%r15),%eax
mov    %al,0x2(%rcx)
movzbl -0x3(%r15),%eax
mov    %al,0x3(%rcx)
movzbl -0x4(%r15),%eax
mov    %al,0x4(%rcx)
movzbl -0x5(%r15),%eax
mov    %al,0x5(%rcx)
movzbl -0x6(%r15),%eax
mov    %al,0x6(%rcx)
movzbl -0x7(%r15),%eax
add    $0xfffffffffffffff8,%r15
mov    %al,0x7(%rcx)
add    $0x8,%rcx
add    $0xfffffff8,%esi
jne    11a0 <v4lconvert_rotate180_yuv420+0xa0>
jmp    12a6 <v4lconvert_rotate180_yuv420+0x1a6>
add    $0x1,%r9
mov    %r9,%r8
and    $0xffffffffffffffe0,%r8
mov    %r8,%r10
neg    %r10
sub    %r8,%r15
lea    (%rsi,%r8,1),%rcx
add    $0x10,%rsi
add    %rbx,%rdi
add    $0xfffffffffffffff1,%rdi
xor    %ebx,%ebx
pxor   %xmm0,%xmm0
nopl   0x0(%rax)
movdqu -0x10(%rdi,%rbx,1),%xmm1
movdqu (%rdi,%rbx,1),%xmm2
movdqa %xmm2,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
packuswb %xmm3,%xmm2
movdqa %xmm1,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm3,%xmm1
movdqu %xmm2,-0x10(%rsi)
movdqu %xmm1,(%rsi)
add    $0x20,%rsi
add    $0xffffffffffffffe0,%rbx
cmp    %rbx,%r10
jne    1220 <v4lconvert_rotate180_yuv420+0x120>
cmp    %r8,%r9
jne    115a <v4lconvert_rotate180_yuv420+0x5a>
lea    (%rdx,%rdx,4),%eax
lea    (%rdx,%rdx,4),%esi
add    $0x3,%esi
test   %eax,%eax
cmovns %eax,%esi
lea    0x3(%rdx),%r9d
test   %edx,%edx
cmovns %edx,%r9d
cmp    $0x4,%edx
jl     154a <v4lconvert_rotate180_yuv420+0x44a>
sar    $0x2,%esi
movslq %esi,%rbx
lea    (%r15,%rbx,1),%rdi
sar    $0x2,%r9d
lea    -0x1(%r9),%r8d
xor    %r10d,%r10d
cmp    $0x1f,%r8d
jb     130d <v4lconvert_rotate180_yuv420+0x20d>
lea    (%rbx,%r15,1),%rax
add    $0x1,%rax
cmp    %rax,%rcx
jae    13a8 <v4lconvert_rotate180_yuv420+0x2a8>
lea    (%r8,%rcx,1),%rax
add    $0x1,%rax
mov    %rbx,%rsi
sub    %r8,%rsi
add    %r15,%rsi
cmp    %rax,%rsi
jae    13a8 <v4lconvert_rotate180_yuv420+0x2a8>
mov    %rcx,%rsi
mov    %r9d,%ecx
sub    %r10d,%ecx
mov    %r10d,%r11d
not    %r11d
add    %r9d,%r11d
and    $0x7,%ecx
je     1348 <v4lconvert_rotate180_yuv420+0x248>
neg    %ecx
xor    %ebx,%ebx
nopl   0x0(%rax,%rax,1)
movzbl (%rdi,%rbx,1),%eax
mov    %al,(%rsi)
add    $0x1,%rsi
add    $0xffffffffffffffff,%rbx
cmp    %ebx,%ecx
jne    1330 <v4lconvert_rotate180_yuv420+0x230>
sub    %ebx,%r10d
add    %rbx,%rdi
cmp    $0x7,%r11d
jb     1466 <v4lconvert_rotate180_yuv420+0x366>
mov    %r9d,%eax
sub    %r10d,%eax
nopl   0x0(%rax,%rax,1)
movzbl (%rdi),%ecx
mov    %cl,(%rsi)
movzbl -0x1(%rdi),%ecx
mov    %cl,0x1(%rsi)
movzbl -0x2(%rdi),%ecx
mov    %cl,0x2(%rsi)
movzbl -0x3(%rdi),%ecx
mov    %cl,0x3(%rsi)
movzbl -0x4(%rdi),%ecx
mov    %cl,0x4(%rsi)
movzbl -0x5(%rdi),%ecx
mov    %cl,0x5(%rsi)
movzbl -0x6(%rdi),%ecx
mov    %cl,0x6(%rsi)
movzbl -0x7(%rdi),%ecx
add    $0xfffffffffffffff8,%rdi
mov    %cl,0x7(%rsi)
add    $0x8,%rsi
add    $0xfffffff8,%eax
jne    1360 <v4lconvert_rotate180_yuv420+0x260>
jmp    1466 <v4lconvert_rotate180_yuv420+0x366>
lea    0x1(%r8),%r11
mov    %r11,%r10
and    $0xffffffffffffffe0,%r10
mov    %r10,%r14
neg    %r14
sub    %r10,%rdi
lea    (%rcx,%r10,1),%rsi
add    $0x10,%rcx
lea    (%rbx,%r15,1),%rax
add    $0xfffffffffffffff1,%rax
xor    %ebx,%ebx
pxor   %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movdqu -0x10(%rax,%rbx,1),%xmm1
movdqu (%rax,%rbx,1),%xmm2
movdqa %xmm2,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
packuswb %xmm3,%xmm2
movdqa %xmm1,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm3,%xmm1
movdqu %xmm2,-0x10(%rcx)
movdqu %xmm1,(%rcx)
add    $0x20,%rcx
add    $0xffffffffffffffe0,%rbx
cmp    %rbx,%r14
jne    13e0 <v4lconvert_rotate180_yuv420+0x2e0>
cmp    %r10,%r11
jne    1310 <v4lconvert_rotate180_yuv420+0x210>
cmp    $0x4,%edx
jl     154a <v4lconvert_rotate180_yuv420+0x44a>
shr    %edx
lea    (%rdi,%rdx,1),%r10
xor    %eax,%eax
cmp    $0x7,%r8d
jb     14a8 <v4lconvert_rotate180_yuv420+0x3a8>
lea    (%rdx,%rdi,1),%rcx
add    $0x1,%rcx
cmp    %rcx,%rsi
jae    1550 <v4lconvert_rotate180_yuv420+0x450>
lea    (%r8,%rsi,1),%rcx
add    $0x1,%rcx
mov    %rdx,%rbx
sub    %r8,%rbx
add    %rdi,%rbx
cmp    %rcx,%rbx
jae    1550 <v4lconvert_rotate180_yuv420+0x450>
mov    %r10,%rdx
mov    %rsi,%rdi
mov    %r9d,%esi
sub    %eax,%esi
mov    %eax,%r8d
not    %r8d
add    %r9d,%r8d
and    $0x7,%esi
je     14e7 <v4lconvert_rotate180_yuv420+0x3e7>
neg    %esi
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nop
movzbl (%rdx,%rbx,1),%ecx
mov    %cl,(%rdi)
add    $0x1,%rdi
add    $0xffffffffffffffff,%rbx
cmp    %ebx,%esi
jne    14d0 <v4lconvert_rotate180_yuv420+0x3d0>
sub    %ebx,%eax
add    %rbx,%rdx
cmp    $0x7,%r8d
jb     154a <v4lconvert_rotate180_yuv420+0x44a>
sub    %r9d,%eax
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl (%rdx,%rcx,1),%ebx
mov    %bl,(%rdi)
movzbl -0x1(%rdx,%rcx,1),%ebx
mov    %bl,0x1(%rdi)
movzbl -0x2(%rdx,%rcx,1),%ebx
mov    %bl,0x2(%rdi)
movzbl -0x3(%rdx,%rcx,1),%ebx
mov    %bl,0x3(%rdi)
movzbl -0x4(%rdx,%rcx,1),%ebx
mov    %bl,0x4(%rdi)
movzbl -0x5(%rdx,%rcx,1),%ebx
mov    %bl,0x5(%rdi)
movzbl -0x6(%rdx,%rcx,1),%ebx
mov    %bl,0x6(%rdi)
movzbl -0x7(%rdx,%rcx,1),%ebx
mov    %bl,0x7(%rdi)
add    $0xfffffffffffffff8,%rcx
add    $0x8,%rdi
cmp    %ecx,%eax
jne    1500 <v4lconvert_rotate180_yuv420+0x400>
pop    %rbx
pop    %r14
pop    %r15
ret
lea    0x1(%r8),%r11
movabs $0x1ffffffe0,%rax
cmp    $0x1f,%r8d
jae    156b <v4lconvert_rotate180_yuv420+0x46b>
xor    %ecx,%ecx
jmp    161c <v4lconvert_rotate180_yuv420+0x51c>
mov    %r11,%rcx
and    %rax,%rcx
lea    0x10(%rsi),%rbx
add    %rdi,%rdx
add    $0xfffffffffffffff1,%rdx
mov    %r11,%r14
and    $0xffffffffffffffe0,%r14
neg    %r14
xor    %edi,%edi
pxor   %xmm0,%xmm0
nopl   0x0(%rax)
movdqu -0x10(%rdx,%rdi,1),%xmm1
movdqu (%rdx,%rdi,1),%xmm2
movdqa %xmm2,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
packuswb %xmm3,%xmm2
movdqa %xmm1,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm3,%xmm1
movdqu %xmm2,-0x10(%rbx)
movdqu %xmm1,(%rbx)
add    $0x20,%rbx
add    $0xffffffffffffffe0,%rdi
cmp    %rdi,%r14
jne    1590 <v4lconvert_rotate180_yuv420+0x490>
cmp    %rcx,%r11
je     154a <v4lconvert_rotate180_yuv420+0x44a>
test   $0x18,%r11b
je     168d <v4lconvert_rotate180_yuv420+0x58d>
add    $0x1,%r8
add    $0x18,%rax
and    %r8,%rax
mov    %r10,%rdx
sub    %rax,%rdx
lea    (%rsi,%rax,1),%rdi
add    %rcx,%rsi
neg    %rcx
and    $0xfffffffffffffff8,%r11
neg    %r11
pxor   %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movq   -0x7(%r10,%rcx,1),%xmm1
punpcklbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm1,%xmm1
movq   %xmm1,(%rsi)
add    $0x8,%rsi
add    $0xfffffffffffffff8,%rcx
cmp    %rcx,%r11
jne    1650 <v4lconvert_rotate180_yuv420+0x550>
cmp    %rax,%r8
jne    14ae <v4lconvert_rotate180_yuv420+0x3ae>
jmp    154a <v4lconvert_rotate180_yuv420+0x44a>
add    %rcx,%rsi
sub    %rcx,%r10
mov    %ecx,%eax
jmp    14a8 <v4lconvert_rotate180_yuv420+0x3a8>

LLVM IR (-O0):
define void @v4lconvert_rotate180_yuv420(i8* %0, i8* %1, i32 %2, i32 %3) {
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i8* %0, i8** %5
store i8* %1, i8** %6
store i32 %2, i32* %7
store i32 %3, i32* %8
%10 = load i32, i32* %7
%11 = load i32, i32* %8
%12 = mul nsw i32 %10, %11
%13 = sub nsw i32 %12, 1
%14 = load i8*, i8** %5
%15 = sext i32 %13 to i64
%16 = getelementptr inbounds i8, i8* %14, i64 %15
store i8* %16, i8** %5
store i32 0, i32* %9
br label %17
17: ; preds = %29, %4
%18 = load i32, i32* %9
%19 = load i32, i32* %7
%20 = load i32, i32* %8
%21 = mul nsw i32 %19, %20
%22 = icmp slt i32 %18, %21
br i1 %22, label %23, label %32
23: ; preds = %17
%24 = load i8*, i8** %5
%25 = getelementptr inbounds i8, i8* %24, i32 -1
store i8* %25, i8** %5
%26 = load i8, i8* %24
%27 = load i8*, i8** %6
%28 = getelementptr inbounds i8, i8* %27, i32 1
store i8* %28, i8** %6
store i8 %26, i8* %27
br label %29
29: ; preds = %23
%30 = load i32, i32* %9
%31 = add nsw i32 %30, 1
store i32 %31, i32* %9
br label %17
32: ; preds = %17
%33 = load i32, i32* %7
%34 = load i32, i32* %8
%35 = mul nsw i32 %33, %34
%36 = mul nsw i32 %35, 5
%37 = sdiv i32 %36, 4
%38 = load i8*, i8** %5
%39 = sext i32 %37 to i64
%40 = getelementptr inbounds i8, i8* %38, i64 %39
store i8* %40, i8** %5
store i32 0, i32* %9
br label %41
41: ; preds = %54, %32
%42 = load i32, i32* %9
%43 = load i32, i32* %7
%44 = load i32, i32* %8
%45 = mul nsw i32 %43, %44
%46 = sdiv i32 %45, 4
%47 = icmp slt i32 %42, %46
br i1 %47, label %48, label %57
48: ; preds = %41
%49 = load i8*, i8** %5
%50 = getelementptr inbounds i8, i8* %49, i32 -1
store i8* %50, i8** %5
%51 = load i8, i8* %49
%52 = load i8*, i8** %6
%53 = getelementptr inbounds i8, i8* %52, i32 1
store i8* %53, i8** %6
store i8 %51, i8* %52
br label %54
54: ; preds = %48
%55 = load i32, i32* %9
%56 = add nsw i32 %55, 1
store i32 %56, i32* %9
br label %41
57: ; preds = %41
%58 = load i32, i32* %7
%59 = load i32, i32* %8
%60 = mul nsw i32 %58, %59
%61 = sdiv i32 %60, 2
%62 = load i8*, i8** %5
%63 = sext i32 %61 to i64
%64 = getelementptr inbounds i8, i8* %62, i64 %63
store i8* %64, i8** %5
store i32 0, i32* %9
br label %65
65: ; preds = %78, %57
%66 = load i32, i32* %9
%67 = load i32, i32* %7
%68 = load i32, i32* %8
%69 = mul nsw i32 %67, %68
%70 = sdiv i32 %69, 4
%71 = icmp slt i32 %66, %70
br i1 %71, label %72, label %81
72: ; preds = %65
%73 = load i8*, i8** %5
%74 = getelementptr inbounds i8, i8* %73, i32 -1
store i8* %74, i8** %5
%75 = load i8, i8* %73
%76 = load i8*, i8** %6
%77 = getelementptr inbounds i8, i8* %76, i32 1
store i8* %77, i8** %6
store i8 %75, i8* %76
br label %78
78: ; preds = %72
%79 = load i32, i32* %9
%80 = add nsw i32 %79, 1
store i32 %80, i32* %9
br label %65
81: ; preds = %65
ret void
}

LLVM IR (-O2):
define void @v4lconvert_rotate180_yuv420(i8* nocapture %0, i8* nocapture writeonly %1, i32 %2, i32 %3) {
%5 = mul i32 %3, %2
%6 = add i32 %5, -1
%7 = sext i32 %6 to i64
%8 = getelementptr inbounds i8, i8* %0, i64 %7
%9 = icmp sgt i32 %5, 0
br i1 %9, label %10, label %353
10: ; preds = %4
%11 = zext i32 %6 to i64
%12 = add nuw nsw i64 %11, 1
%13 = icmp ult i32 %6, 31
br i1 %13, label %52, label %14
14: ; preds = %10
%15 = zext i32 %6 to i64
%16 = add nuw nsw i64 %15, 1
%17 = getelementptr i8, i8* %1, i64 %16
%18 = sub nsw i64 %7, %15
%19 = getelementptr i8, i8* %0, i64 %18
%20 = add nsw i64 %7, 1
%21 = getelementptr i8, i8* %0, i64 %20
%22 = icmp ugt i8* %21, %1
%23 = icmp ult i8* %19, %17
%24 = and i1 %22, %23
br i1 %24, label %52, label %25
25: ; preds = %14
%26 = and i64 %12, 8589934560
%27 = trunc i64 %26 to i32
%28 = sub nsw i64 0, %26
%29 = getelementptr i8, i8* %8, i64 %28
%30 = getelementptr i8, i8* %1, i64 %26
br label %31
31: ; preds = %31, %25
%32 = phi i64 [ 0, %25 ], [ %48, %31 ]
%33 = sub i64 0, %32
%34 = getelementptr i8, i8* %8, i64 %33
%35 = getelementptr i8, i8* %1, i64 %32
%36 = getelementptr i8, i8* %34, i64 -15
%37 = bitcast i8* %36 to <16 x i8>*
%38 = load <16 x i8>, <16 x i8>* %37
%39 = shufflevector <16 x i8> %38, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%40 = getelementptr i8, i8* %34, i64 -16
%41 = getelementptr i8, i8* %40, i64 -15
%42 = bitcast i8* %41 to <16 x i8>*
%43 = load <16 x i8>, <16 x i8>* %42
%44 = shufflevector <16 x i8> %43, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%45 = bitcast i8* %35 to <16 x i8>*
store <16 x i8> %39, <16 x i8>* %45
%46 = getelementptr i8, i8* %35, i64 16
%47 = bitcast i8* %46 to <16 x i8>*
store <16 x i8> %44, <16 x i8>* %47
%48 = add nuw i64 %32, 32
%49 = icmp eq i64 %48, %26
br i1 %49, label %50, label %31
50: ; preds = %31
%51 = icmp eq i64 %12, %26
br i1 %51, label %109, label %52
52: ; preds = %14, %10, %50
%53 = phi i32 [ 0, %14 ], [ 0, %10 ], [ %27, %50 ]
%54 = phi i8* [ %8, %14 ], [ %8, %10 ], [ %29, %50 ]
%55 = phi i8* [ %1, %14 ], [ %1, %10 ], [ %30, %50 ]
%56 = sub i32 %5, %53
%57 = xor i32 %53, -1
%58 = add i32 %5, %57
%59 = and i32 %56, 7
%60 = icmp eq i32 %59, 0
br i1 %60, label %72, label %61
61: ; preds = %52, %61
%62 = phi i32 [ %69, %61 ], [ %53, %52 ]
%63 = phi i8* [ %66, %61 ], [ %54, %52 ]
%64 = phi i8* [ %68, %61 ], [ %55, %52 ]
%65 = phi i32 [ %70, %61 ], [ 0, %52 ]
%66 = getelementptr inbounds i8, i8* %63, i64 -1
%67 = load i8, i8* %63
%68 = getelementptr inbounds i8, i8* %64, i64 1
store i8 %67, i8* %64
%69 = add nuw nsw i32 %62, 1
%70 = add i32 %65, 1
%71 = icmp eq i32 %70, %59
br i1 %71, label %72, label %61
72: ; preds = %61, %52
%73 = phi i8* [ undef, %52 ], [ %66, %61 ]
%74 = phi i8* [ undef, %52 ], [ %68, %61 ]
%75 = phi i32 [ %53, %52 ], [ %69, %61 ]
%76 = phi i8* [ %54, %52 ], [ %66, %61 ]
%77 = phi i8* [ %55, %52 ], [ %68, %61 ]
%78 = icmp ult i32 %58, 7
br i1 %78, label %109, label %79
79: ; preds = %72, %79
%80 = phi i32 [ %107, %79 ], [ %75, %72 ]
%81 = phi i8* [ %104, %79 ], [ %76, %72 ]
%82 = phi i8* [ %106, %79 ], [ %77, %72 ]
%83 = getelementptr inbounds i8, i8* %81, i64 -1
%84 = load i8, i8* %81
%85 = getelementptr inbounds i8, i8* %82, i64 1
store i8 %84, i8* %82
%86 = getelementptr inbounds i8, i8* %81, i64 -2
%87 = load i8, i8* %83
%88 = getelementptr inbounds i8, i8* %82, i64 2
store i8 %87, i8* %85
%89 = getelementptr inbounds i8, i8* %81, i64 -3
%90 = load i8, i8* %86
%91 = getelementptr inbounds i8, i8* %82, i64 3
store i8 %90, i8* %88
%92 = getelementptr inbounds i8, i8* %81, i64 -4
%93 = load i8, i8* %89
%94 = getelementptr inbounds i8, i8* %82, i64 4
store i8 %93, i8* %91
%95 = getelementptr inbounds i8, i8* %81, i64 -5
%96 = load i8, i8* %92
%97 = getelementptr inbounds i8, i8* %82, i64 5
store i8 %96, i8* %94
%98 = getelementptr inbounds i8, i8* %81, i64 -6
%99 = load i8, i8* %95
%100 = getelementptr inbounds i8, i8* %82, i64 6
store i8 %99, i8* %97
%101 = getelementptr inbounds i8, i8* %81, i64 -7
%102 = load i8, i8* %98
%103 = getelementptr inbounds i8, i8* %82, i64 7
store i8 %102, i8* %100
%104 = getelementptr inbounds i8, i8* %81, i64 -8
%105 = load i8, i8* %101
%106 = getelementptr inbounds i8, i8* %82, i64 8
store i8 %105, i8* %103
%107 = add nuw nsw i32 %80, 8
%108 = icmp eq i32 %107, %5
br i1 %108, label %109, label %79
109: ; preds = %72, %79, %50
%110 = phi i8* [ %29, %50 ], [ %73, %72 ], [ %104, %79 ]
%111 = phi i8* [ %30, %50 ], [ %74, %72 ], [ %106, %79 ]
%112 = mul nsw i32 %5, 5
%113 = sdiv i32 %112, 4
%114 = sext i32 %113 to i64
%115 = getelementptr inbounds i8, i8* %110, i64 %114
%116 = sdiv i32 %5, 4
%117 = icmp sgt i32 %5, 3
br i1 %117, label %118, label %353
118: ; preds = %109
%119 = add nsw i32 %116, -1
%120 = zext i32 %119 to i64
%121 = add nuw nsw i64 %120, 1
%122 = icmp ult i32 %119, 31
br i1 %122, label %162, label %123
123: ; preds = %118
%124 = add nsw i32 %116, -1
%125 = zext i32 %124 to i64
%126 = add nuw nsw i64 %125, 1
%127 = getelementptr i8, i8* %111, i64 %126
%128 = sub nsw i64 %114, %125
%129 = getelementptr i8, i8* %110, i64 %128
%130 = add nsw i64 %114, 1
%131 = getelementptr i8, i8* %110, i64 %130
%132 = icmp ult i8* %111, %131
%133 = icmp ult i8* %129, %127
%134 = and i1 %132, %133
br i1 %134, label %162, label %135
135: ; preds = %123
%136 = and i64 %121, 8589934560
%137 = trunc i64 %136 to i32
%138 = sub nsw i64 0, %136
%139 = getelementptr i8, i8* %115, i64 %138
%140 = getelementptr i8, i8* %111, i64 %136
br label %141
141: ; preds = %141, %135
%142 = phi i64 [ 0, %135 ], [ %158, %141 ]
%143 = sub i64 0, %142
%144 = getelementptr i8, i8* %115, i64 %143
%145 = getelementptr i8, i8* %111, i64 %142
%146 = getelementptr i8, i8* %144, i64 -15
%147 = bitcast i8* %146 to <16 x i8>*
%148 = load <16 x i8>, <16 x i8>* %147
%149 = shufflevector <16 x i8> %148, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%150 = getelementptr i8, i8* %144, i64 -16
%151 = getelementptr i8, i8* %150, i64 -15
%152 = bitcast i8* %151 to <16 x i8>*
%153 = load <16 x i8>, <16 x i8>* %152
%154 = shufflevector <16 x i8> %153, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%155 = bitcast i8* %145 to <16 x i8>*
store <16 x i8> %149, <16 x i8>* %155
%156 = getelementptr i8, i8* %145, i64 16
%157 = bitcast i8* %156 to <16 x i8>*
store <16 x i8> %154, <16 x i8>* %157
%158 = add nuw i64 %142, 32
%159 = icmp eq i64 %158, %136
br i1 %159, label %160, label %141
160: ; preds = %141
%161 = icmp eq i64 %121, %136
br i1 %161, label %219, label %162
162: ; preds = %123, %118, %160
%163 = phi i32 [ 0, %123 ], [ 0, %118 ], [ %137, %160 ]
%164 = phi i8* [ %115, %123 ], [ %115, %118 ], [ %139, %160 ]
%165 = phi i8* [ %111, %123 ], [ %111, %118 ], [ %140, %160 ]
%166 = sub i32 %116, %163
%167 = xor i32 %163, -1
%168 = add i32 %116, %167
%169 = and i32 %166, 7
%170 = icmp eq i32 %169, 0
br i1 %170, label %182, label %171
171: ; preds = %162, %171
%172 = phi i32 [ %179, %171 ], [ %163, %162 ]
%173 = phi i8* [ %176, %171 ], [ %164, %162 ]
%174 = phi i8* [ %178, %171 ], [ %165, %162 ]
%175 = phi i32 [ %180, %171 ], [ 0, %162 ]
%176 = getelementptr inbounds i8, i8* %173, i64 -1
%177 = load i8, i8* %173
%178 = getelementptr inbounds i8, i8* %174, i64 1
store i8 %177, i8* %174
%179 = add nuw nsw i32 %172, 1
%180 = add i32 %175, 1
%181 = icmp eq i32 %180, %169
br i1 %181, label %182, label %171
182: ; preds = %171, %162
%183 = phi i8* [ undef, %162 ], [ %176, %171 ]
%184 = phi i8* [ undef, %162 ], [ %178, %171 ]
%185 = phi i32 [ %163, %162 ], [ %179, %171 ]
%186 = phi i8* [ %164, %162 ], [ %176, %171 ]
%187 = phi i8* [ %165, %162 ], [ %178, %171 ]
%188 = icmp ult i32 %168, 7
br i1 %188, label %219, label %189
189: ; preds = %182, %189
%190 = phi i32 [ %217, %189 ], [ %185, %182 ]
%191 = phi i8* [ %214, %189 ], [ %186, %182 ]
%192 = phi i8* [ %216, %189 ], [ %187, %182 ]
%193 = getelementptr inbounds i8, i8* %191, i64 -1
%194 = load i8, i8* %191
%195 = getelementptr inbounds i8, i8* %192, i64 1
store i8 %194, i8* %192
%196 = getelementptr inbounds i8, i8* %191, i64 -2
%197 = load i8, i8* %193
%198 = getelementptr inbounds i8, i8* %192, i64 2
store i8 %197, i8* %195
%199 = getelementptr inbounds i8, i8* %191, i64 -3
%200 = load i8, i8* %196
%201 = getelementptr inbounds i8, i8* %192, i64 3
store i8 %200, i8* %198
%202 = getelementptr inbounds i8, i8* %191, i64 -4
%203 = load i8, i8* %199
%204 = getelementptr inbounds i8, i8* %192, i64 4
store i8 %203, i8* %201
%205 = getelementptr inbounds i8, i8* %191, i64 -5
%206 = load i8, i8* %202
%207 = getelementptr inbounds i8, i8* %192, i64 5
store i8 %206, i8* %204
%208 = getelementptr inbounds i8, i8* %191, i64 -6
%209 = load i8, i8* %205
%210 = getelementptr inbounds i8, i8* %192, i64 6
store i8 %209, i8* %207
%211 = getelementptr inbounds i8, i8* %191, i64 -7
%212 = load i8, i8* %208
%213 = getelementptr inbounds i8, i8* %192, i64 7
store i8 %212, i8* %210
%214 = getelementptr inbounds i8, i8* %191, i64 -8
%215 = load i8, i8* %211
%216 = getelementptr inbounds i8, i8* %192, i64 8
store i8 %215, i8* %213
%217 = add nuw nsw i32 %190, 8
%218 = icmp eq i32 %217, %116
br i1 %218, label %219, label %189
219: ; preds = %182, %189, %160
%220 = phi i8* [ %139, %160 ], [ %183, %182 ], [ %214, %189 ]
%221 = phi i8* [ %140, %160 ], [ %184, %182 ], [ %216, %189 ]
br i1 %117, label %222, label %353
222: ; preds = %219
%223 = lshr i32 %5, 1
%224 = zext i32 %223 to i64
%225 = getelementptr inbounds i8, i8* %220, i64 %224
%226 = add nsw i32 %116, -1
%227 = zext i32 %226 to i64
%228 = add nuw nsw i64 %227, 1
%229 = icmp ult i32 %226, 7
br i1 %229, label %298, label %230
230: ; preds = %222
%231 = add nsw i32 %116, -1
%232 = zext i32 %231 to i64
%233 = add nuw nsw i64 %232, 1
%234 = getelementptr i8, i8* %221, i64 %233
%235 = sub nsw i64 %224, %232
%236 = getelementptr i8, i8* %220, i64 %235
%237 = add nuw nsw i64 %224, 1
%238 = getelementptr i8, i8* %220, i64 %237
%239 = icmp ult i8* %221, %238
%240 = icmp ult i8* %236, %234
%241 = and i1 %239, %240
br i1 %241, label %298, label %242
242: ; preds = %230
%243 = icmp ult i32 %226, 31
br i1 %243, label %274, label %244
244: ; preds = %242
%245 = and i64 %228, 8589934560
br label %246
246: ; preds = %246, %244
%247 = phi i64 [ 0, %244 ], [ %263, %246 ]
%248 = sub i64 0, %247
%249 = getelementptr i8, i8* %225, i64 %248
%250 = getelementptr i8, i8* %221, i64 %247
%251 = getelementptr i8, i8* %249, i64 -15
%252 = bitcast i8* %251 to <16 x i8>*
%253 = load <16 x i8>, <16 x i8>* %252
%254 = shufflevector <16 x i8> %253, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%255 = getelementptr i8, i8* %249, i64 -16
%256 = getelementptr i8, i8* %255, i64 -15
%257 = bitcast i8* %256 to <16 x i8>*
%258 = load <16 x i8>, <16 x i8>* %257
%259 = shufflevector <16 x i8> %258, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%260 = bitcast i8* %250 to <16 x i8>*
store <16 x i8> %254, <16 x i8>* %260
%261 = getelementptr i8, i8* %250, i64 16
%262 = bitcast i8* %261 to <16 x i8>*
store <16 x i8> %259, <16 x i8>* %262
%263 = add nuw i64 %247, 32
%264 = icmp eq i64 %263, %245
br i1 %264, label %265, label %246
265: ; preds = %246
%266 = icmp eq i64 %228, %245
br i1 %266, label %353, label %267
267: ; preds = %265
%268 = getelementptr i8, i8* %221, i64 %245
%269 = sub nsw i64 0, %245
%270 = getelementptr i8, i8* %225, i64 %269
%271 = trunc i64 %245 to i32
%272 = and i64 %228, 24
%273 = icmp eq i64 %272, 0
br i1 %273, label %298, label %274
274: ; preds = %242, %267
%275 = phi i64 [ %245, %267 ], [ 0, %242 ]
%276 = add nsw i32 %116, -1
%277 = zext i32 %276 to i64
%278 = add nuw nsw i64 %277, 1
%279 = and i64 %278, 8589934584
%280 = trunc i64 %279 to i32
%281 = sub nsw i64 0, %279
%282 = getelementptr i8, i8* %225, i64 %281
%283 = getelementptr i8, i8* %221, i64 %279
%284 = getelementptr i8, i8* %225, i64 -7
br label %285
285: ; preds = %285, %274
%286 = phi i64 [ %275, %274 ], [ %294, %285 ]
%287 = sub i64 0, %286
%288 = getelementptr i8, i8* %221, i64 %286
%289 = getelementptr i8, i8* %284, i64 %287
%290 = bitcast i8* %289 to <8 x i8>*
%291 = load <8 x i8>, <8 x i8>* %290
%292 = shufflevector <8 x i8> %291, <8 x i8> poison, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%293 = bitcast i8* %288 to <8 x i8>*
store <8 x i8> %292, <8 x i8>* %293
%294 = add nuw i64 %286, 8
%295 = icmp eq i64 %294, %279
br i1 %295, label %296, label %285
296: ; preds = %285
%297 = icmp eq i64 %278, %279
br i1 %297, label %353, label %298
298: ; preds = %230, %222, %267, %296
%299 = phi i32 [ 0, %222 ], [ 0, %230 ], [ %271, %267 ], [ %280, %296 ]
%300 = phi i8* [ %225, %222 ], [ %225, %230 ], [ %270, %267 ], [ %282, %296 ]
%301 = phi i8* [ %221, %222 ], [ %221, %230 ], [ %268, %267 ], [ %283, %296 ]
%302 = sub i32 %116, %299
%303 = xor i32 %299, -1
%304 = add i32 %116, %303
%305 = and i32 %302, 7
%306 = icmp eq i32 %305, 0
br i1 %306, label %318, label %307
307: ; preds = %298, %307
%308 = phi i32 [ %315, %307 ], [ %299, %298 ]
%309 = phi i8* [ %312, %307 ], [ %300, %298 ]
%310 = phi i8* [ %314, %307 ], [ %301, %298 ]
%311 = phi i32 [ %316, %307 ], [ 0, %298 ]
%312 = getelementptr inbounds i8, i8* %309, i64 -1
%313 = load i8, i8* %309
%314 = getelementptr inbounds i8, i8* %310, i64 1
store i8 %313, i8* %310
%315 = add nuw nsw i32 %308, 1
%316 = add i32 %311, 1
%317 = icmp eq i32 %316, %305
br i1 %317, label %318, label %307
318: ; preds = %307, %298
%319 = phi i32 [ %299, %298 ], [ %315, %307 ]
%320 = phi i8* [ %300, %298 ], [ %312, %307 ]
%321 = phi i8* [ %301, %298 ], [ %314, %307 ]
%322 = icmp ult i32 %304, 7
br i1 %322, label %353, label %323
323: ; preds = %318, %323
%324 = phi i32 [ %351, %323 ], [ %319, %318 ]
%325 = phi i8* [ %348, %323 ], [ %320, %318 ]
%326 = phi i8* [ %350, %323 ], [ %321, %318 ]
%327 = getelementptr inbounds i8, i8* %325, i64 -1
%328 = load i8, i8* %325
%329 = getelementptr inbounds i8, i8* %326, i64 1
store i8 %328, i8* %326
%330 = getelementptr inbounds i8, i8* %325, i64 -2
%331 = load i8, i8* %327
%332 = getelementptr inbounds i8, i8* %326, i64 2
store i8 %331, i8* %329
%333 = getelementptr inbounds i8, i8* %325, i64 -3
%334 = load i8, i8* %330
%335 = getelementptr inbounds i8, i8* %326, i64 3
store i8 %334, i8* %332
%336 = getelementptr inbounds i8, i8* %325, i64 -4
%337 = load i8, i8* %333
%338 = getelementptr inbounds i8, i8* %326, i64 4
store i8 %337, i8* %335
%339 = getelementptr inbounds i8, i8* %325, i64 -5
%340 = load i8, i8* %336
%341 = getelementptr inbounds i8, i8* %326, i64 5
store i8 %340, i8* %338
%342 = getelementptr inbounds i8, i8* %325, i64 -6
%343 = load i8, i8* %339
%344 = getelementptr inbounds i8, i8* %326, i64 6
store i8 %343, i8* %341
%345 = getelementptr inbounds i8, i8* %325, i64 -7
%346 = load i8, i8* %342
%347 = getelementptr inbounds i8, i8* %326, i64 7
store i8 %346, i8* %344
%348 = getelementptr inbounds i8, i8* %325, i64 -8
%349 = load i8, i8* %345
%350 = getelementptr inbounds i8, i8* %326, i64 8
store i8 %349, i8* %347
%351 = add nuw nsw i32 %324, 8
%352 = icmp eq i32 %351, %116
br i1 %352, label %353, label %323
353: ; preds = %318, %323, %265, %296, %4, %109, %219
ret void
}