long EthernetPacketGetInternal(unsigned long ulBase, unsigned char *pucBuf,
                               long lBufLen) {
  unsigned long ulTemp;
  long lFrameLen, lTempLen;
  long i = 0;
  ulTemp = (*((volatile unsigned long *)(ulBase + 0x00000010)));
  lFrameLen = (long)(ulTemp & 0xFFFF);
  pucBuf[i++] = (unsigned char)((ulTemp >> 16) & 0xff);
  pucBuf[i++] = (unsigned char)((ulTemp >> 24) & 0xff);
  lTempLen = (lBufLen < (lFrameLen - 6)) ? lBufLen : (lFrameLen - 6);
  while (i <= (lTempLen - 4)) {
    *(unsigned long *)&pucBuf[i] =
        (*((volatile unsigned long *)(ulBase + 0x00000010)));
    i += 4;
  }
  if (i < lTempLen) {
    ulTemp = (*((volatile unsigned long *)(ulBase + 0x00000010)));
    if (i == lTempLen - 3) {
      pucBuf[i++] = ((ulTemp >> 0) & 0xff);
      pucBuf[i++] = ((ulTemp >> 8) & 0xff);
      pucBuf[i++] = ((ulTemp >> 16) & 0xff);
      i += 1;
    } else if (i == lTempLen - 2) {
      pucBuf[i++] = ((ulTemp >> 0) & 0xff);
      pucBuf[i++] = ((ulTemp >> 8) & 0xff);
      i += 2;
    } else if (i == lTempLen - 1) {
      pucBuf[i++] = ((ulTemp >> 0) & 0xff);
      i += 3;
    }
  }
  while (i < (lFrameLen - 2)) {
    ulTemp = (*((volatile unsigned long *)(ulBase + 0x00000010)));
    i += 4;
  }
  lFrameLen -= 6;
  if (lFrameLen > lBufLen) {
    return (-lFrameLen);
  }
  return (lFrameLen);
}


x86 assembly (clang, -O0):
<EthernetPacketGetInternal>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
movq   $0x0,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
and    $0xffff,%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rax
shr    $0x10,%rax
and    $0xff,%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x28(%rbp),%rax
shr    $0x18,%rax
and    $0xff,%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    $0x6,%rcx
cmp    %rcx,%rax
jge    11a0 <EthernetPacketGetInternal+0xa0>
mov    -0x20(%rbp),%rax
mov    %rax,-0x48(%rbp)
jmp    11ac <EthernetPacketGetInternal+0xac>
mov    -0x30(%rbp),%rax
sub    $0x6,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x40(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x4,%rcx
cmp    %rcx,%rax
jg     11ee <EthernetPacketGetInternal+0xee>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rdx
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rdx,(%rax,%rcx,1)
mov    -0x40(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x40(%rbp)
jmp    11b4 <EthernetPacketGetInternal+0xb4>
mov    -0x40(%rbp),%rax
cmp    -0x38(%rbp),%rax
jge    1368 <EthernetPacketGetInternal+0x268>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x40(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x3,%rcx
cmp    %rcx,%rax
jne    12a0 <EthernetPacketGetInternal+0x1a0>
mov    -0x28(%rbp),%rax
shr    $0x0,%rax
and    $0xff,%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x28(%rbp),%rax
shr    $0x8,%rax
and    $0xff,%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x28(%rbp),%rax
shr    $0x10,%rax
and    $0xff,%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x40(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x40(%rbp)
jmp    1363 <EthernetPacketGetInternal+0x263>
mov    -0x40(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x2,%rcx
cmp    %rcx,%rax
jne    1312 <EthernetPacketGetInternal+0x212>
mov    -0x28(%rbp),%rax
shr    $0x0,%rax
and    $0xff,%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x28(%rbp),%rax
shr    $0x8,%rax
and    $0xff,%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x40(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x40(%rbp)
jmp    135e <EthernetPacketGetInternal+0x25e>
mov    -0x40(%rbp),%rax
mov    -0x38(%rbp),%rcx
sub    $0x1,%rcx
cmp    %rcx,%rax
jne    1359 <EthernetPacketGetInternal+0x259>
mov    -0x28(%rbp),%rax
shr    $0x0,%rax
and    $0xff,%rax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    %rcx,%rsi
add    $0x1,%rsi
mov    %rsi,-0x40(%rbp)
mov    %dl,(%rax,%rcx,1)
mov    -0x40(%rbp),%rax
add    $0x3,%rax
mov    %rax,-0x40(%rbp)
jmp    135e <EthernetPacketGetInternal+0x25e>
jmp    1363 <EthernetPacketGetInternal+0x263>
jmp    1368 <EthernetPacketGetInternal+0x268>
jmp    136d <EthernetPacketGetInternal+0x26d>
mov    -0x40(%rbp),%rax
mov    -0x30(%rbp),%rcx
sub    $0x2,%rcx
cmp    %rcx,%rax
jge    139f <EthernetPacketGetInternal+0x29f>
mov    -0x10(%rbp),%rax
mov    0x10(%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x40(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x40(%rbp)
jmp    136d <EthernetPacketGetInternal+0x26d>
mov    -0x30(%rbp),%rax
sub    $0x6,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
cmp    -0x20(%rbp),%rax
jle    13c8 <EthernetPacketGetInternal+0x2c8>
xor    %eax,%eax
sub    -0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    13d0 <EthernetPacketGetInternal+0x2d0>
mov    -0x30(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<EthernetPacketGetInternal>:
push   %r14
push   %rbx
mov    0x10(%rdi),%rax
movzwl %ax,%r8d
mov    %rax,%rcx
shr    $0x10,%rcx
mov    %cl,(%rsi)
shr    $0x18,%rax
mov    %al,0x1(%rsi)
lea    -0x6(%r8),%r9
cmp    %rdx,%r9
mov    %r9,%r10
cmovg  %rdx,%r10
mov    $0x2,%eax
cmp    $0x6,%r10
jl     11e2 <EthernetPacketGetInternal+0xe2>
lea    -0x6(%r10),%rax
mov    %rax,%rcx
shr    $0x2,%rcx
add    $0x1,%rcx
mov    %ecx,%r11d
and    $0x7,%r11d
cmp    $0x1c,%rax
jae    115b <EthernetPacketGetInternal+0x5b>
mov    $0x2,%eax
jmp    11c1 <EthernetPacketGetInternal+0xc1>
and    $0xfffffffffffffff8,%rcx
mov    $0x2,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    0x10(%rdi),%rbx
mov    %rbx,(%rsi,%rax,1)
mov    0x10(%rdi),%rbx
mov    %rbx,0x4(%rsi,%rax,1)
mov    0x10(%rdi),%rbx
mov    %rbx,0x8(%rsi,%rax,1)
mov    0x10(%rdi),%rbx
mov    %rbx,0xc(%rsi,%rax,1)
mov    0x10(%rdi),%rbx
mov    %rbx,0x10(%rsi,%rax,1)
mov    0x10(%rdi),%rbx
mov    %rbx,0x14(%rsi,%rax,1)
mov    0x10(%rdi),%rbx
mov    %rbx,0x18(%rsi,%rax,1)
mov    0x10(%rdi),%rbx
mov    %rbx,0x1c(%rsi,%rax,1)
add    $0x20,%rax
add    $0xfffffffffffffff8,%rcx
jne    1170 <EthernetPacketGetInternal+0x70>
test   %r11,%r11
je     11e2 <EthernetPacketGetInternal+0xe2>
cs nopw 0x0(%rax,%rax,1)
mov    0x10(%rdi),%rcx
mov    %rcx,(%rsi,%rax,1)
add    $0x4,%rax
add    $0xffffffffffffffff,%r11
jne    11d0 <EthernetPacketGetInternal+0xd0>
cmp    %r10,%rax
jge    123b <EthernetPacketGetInternal+0x13b>
mov    0x10(%rdi),%r11
lea    -0x3(%r10),%rcx
cmp    %rcx,%rax
jne    1211 <EthernetPacketGetInternal+0x111>
mov    %rax,%r10
or     $0x1,%r10
mov    %r11b,(%rsi,%rax,1)
mov    %r11,%rbx
shr    $0x8,%rbx
lea    0x2(%rax),%r14
mov    $0x10,%ecx
jmp    122c <EthernetPacketGetInternal+0x12c>
lea    -0x2(%r10),%rcx
cmp    %rcx,%rax
jne    1270 <EthernetPacketGetInternal+0x170>
mov    %rax,%r14
or     $0x1,%r14
mov    $0x8,%ecx
mov    %rax,%r10
mov    %r11,%rbx
mov    %bl,(%rsi,%r10,1)
shr    %cl,%r11
mov    %r11b,(%rsi,%r14,1)
add    $0x4,%rax
lea    -0x2(%r8),%rcx
cmp    %rcx,%rax
jge    125d <EthernetPacketGetInternal+0x15d>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    0x10(%rdi),%rsi
add    $0x4,%rax
cmp    %rcx,%rax
jl     1250 <EthernetPacketGetInternal+0x150>
mov    $0x6,%eax
sub    %r8,%rax
cmp    %rdx,%r9
cmovle %r9,%rax
pop    %rbx
pop    %r14
ret
add    $0xffffffffffffffff,%r10
mov    %rax,%r14
cmp    %r10,%rax
je     1233 <EthernetPacketGetInternal+0x133>
jmp    123b <EthernetPacketGetInternal+0x13b>

LLVM IR (-O0):
define i64 @EthernetPacketGetInternal(i64 %0, i8* %1, i64 %2) {
%4 = alloca i64
%5 = alloca i64
%6 = alloca i8*
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
store i64 %0, i64* %5
store i8* %1, i8** %6
store i64 %2, i64* %7
store i64 0, i64* %11
%12 = load i64, i64* %5
%13 = add i64 %12, 16
%14 = inttoptr i64 %13 to i64*
%15 = load volatile i64, i64* %14
store i64 %15, i64* %8
%16 = load i64, i64* %8
%17 = and i64 %16, 65535
store i64 %17, i64* %9
%18 = load i64, i64* %8
%19 = lshr i64 %18, 16
%20 = and i64 %19, 255
%21 = trunc i64 %20 to i8
%22 = load i8*, i8** %6
%23 = load i64, i64* %11
%24 = add nsw i64 %23, 1
store i64 %24, i64* %11
%25 = getelementptr inbounds i8, i8* %22, i64 %23
store i8 %21, i8* %25
%26 = load i64, i64* %8
%27 = lshr i64 %26, 24
%28 = and i64 %27, 255
%29 = trunc i64 %28 to i8
%30 = load i8*, i8** %6
%31 = load i64, i64* %11
%32 = add nsw i64 %31, 1
store i64 %32, i64* %11
%33 = getelementptr inbounds i8, i8* %30, i64 %31
store i8 %29, i8* %33
%34 = load i64, i64* %7
%35 = load i64, i64* %9
%36 = sub nsw i64 %35, 6
%37 = icmp slt i64 %34, %36
br i1 %37, label %38, label %40
38: ; preds = %3
%39 = load i64, i64* %7
br label %43
40: ; preds = %3
%41 = load i64, i64* %9
%42 = sub nsw i64 %41, 6
br label %43
43: ; preds = %40, %38
%44 = phi i64 [ %39, %38 ], [ %42, %40 ]
store i64 %44, i64* %10
br label %45
45: ; preds = %50, %43
%46 = load i64, i64* %11
%47 = load i64, i64* %10
%48 = sub nsw i64 %47, 4
%49 = icmp sle i64 %46, %48
br i1 %49, label %50, label %61
50: ; preds = %45
%51 = load i64, i64* %5
%52 = add i64 %51, 16
%53 = inttoptr i64 %52 to i64*
%54 = load volatile i64, i64* %53
%55 = load i8*, i8** %6
%56 = load i64, i64* %11
%57 = getelementptr inbounds i8, i8* %55, i64 %56
%58 = bitcast i8* %57 to i64*
store i64 %54, i64* %58
%59 = load i64, i64* %11
%60 = add nsw i64 %59, 4
store i64 %60, i64* %11
br label %45
61: ; preds = %45
%62 = load i64, i64* %11
%63 = load i64, i64* %10
%64 = icmp slt i64 %62, %63
br i1 %64, label %65, label %144
65: ; preds = %61
%66 = load i64, i64* %5
%67 = add i64 %66, 16
%68 = inttoptr i64 %67 to i64*
%69 = load volatile i64, i64* %68
store i64 %69, i64* %8
%70 = load i64, i64* %11
%71 = load i64, i64* %10
%72 = sub nsw i64 %71, 3
%73 = icmp eq i64 %70, %72
br i1 %73, label %74, label %101
74: ; preds = %65
%75 = load i64, i64* %8
%76 = lshr i64 %75, 0
%77 = and i64 %76, 255
%78 = trunc i64 %77 to i8
%79 = load i8*, i8** %6
%80 = load i64, i64* %11
%81 = add nsw i64 %80, 1
store i64 %81, i64* %11
%82 = getelementptr inbounds i8, i8* %79, i64 %80
store i8 %78, i8* %82
%83 = load i64, i64* %8
%84 = lshr i64 %83, 8
%85 = and i64 %84, 255
%86 = trunc i64 %85 to i8
%87 = load i8*, i8** %6
%88 = load i64, i64* %11
%89 = add nsw i64 %88, 1
store i64 %89, i64* %11
%90 = getelementptr inbounds i8, i8* %87, i64 %88
store i8 %86, i8* %90
%91 = load i64, i64* %8
%92 = lshr i64 %91, 16
%93 = and i64 %92, 255
%94 = trunc i64 %93 to i8
%95 = load i8*, i8** %6
%96 = load i64, i64* %11
%97 = add nsw i64 %96, 1
store i64 %97, i64* %11
%98 = getelementptr inbounds i8, i8* %95, i64 %96
store i8 %94, i8* %98
%99 = load i64, i64* %11
%100 = add nsw i64 %99, 1
store i64 %100, i64* %11
br label %143
101: ; preds = %65
%102 = load i64, i64* %11
%103 = load i64, i64* %10
%104 = sub nsw i64 %103, 2
%105 = icmp eq i64 %102, %104
br i1 %105, label %106, label %125
106: ; preds = %101
%107 = load i64, i64* %8
%108 = lshr i64 %107, 0
%109 = and i64 %108, 255
%110 = trunc i64 %109 to i8
%111 = load i8*, i8** %6
%112 = load i64, i64* %11
%113 = add nsw i64 %112, 1
store i64 %113, i64* %11
%114 = getelementptr inbounds i8, i8* %111, i64 %112
store i8 %110, i8* %114
%115 = load i64, i64* %8
%116 = lshr i64 %115, 8
%117 = and i64 %116, 255
%118 = trunc i64 %117 to i8
%119 = load i8*, i8** %6
%120 = load i64, i64* %11
%121 = add nsw i64 %120, 1
store i64 %121, i64* %11
%122 = getelementptr inbounds i8, i8* %119, i64 %120
store i8 %118, i8* %122
%123 = load i64, i64* %11
%124 = add nsw i64 %123, 2
store i64 %124, i64* %11
br label %142
125: ; preds = %101
%126 = load i64, i64* %11
%127 = load i64, i64* %10
%128 = sub nsw i64 %127, 1
%129 = icmp eq i64 %126, %128
br i1 %129, label %130, label %141
130: ; preds = %125
%131 = load i64, i64* %8
%132 = lshr i64 %131, 0
%133 = and i64 %132, 255
%134 = trunc i64 %133 to i8
%135 = load i8*, i8** %6
%136 = load i64, i64* %11
%137 = add nsw i64 %136, 1
store i64 %137, i64* %11
%138 = getelementptr inbounds i8, i8* %135, i64 %136
store i8 %134, i8* %138
%139 = load i64, i64* %11
%140 = add nsw i64 %139, 3
store i64 %140, i64* %11
br label %141
141: ; preds = %130, %125
br label %142
142: ; preds = %141, %106
br label %143
143: ; preds = %142, %74
br label %144
144: ; preds = %143, %61
br label %145
145: ; preds = %150, %144
%146 = load i64, i64* %11
%147 = load i64, i64* %9
%148 = sub nsw i64 %147, 2
%149 = icmp slt i64 %146, %148
br i1 %149, label %150, label %157
150: ; preds = %145
%151 = load i64, i64* %5
%152 = add i64 %151, 16
%153 = inttoptr i64 %152 to i64*
%154 = load volatile i64, i64* %153
store i64 %154, i64* %8
%155 = load i64, i64* %11
%156 = add nsw i64 %155, 4
store i64 %156, i64* %11
br label %145
157: ; preds = %145
%158 = load i64, i64* %9
%159 = sub nsw i64 %158, 6
store i64 %159, i64* %9
%160 = load i64, i64* %9
%161 = load i64, i64* %7
%162 = icmp sgt i64 %160, %161
br i1 %162, label %163, label %166
163: ; preds = %157
%164 = load i64, i64* %9
%165 = sub nsw i64 0, %164
store i64 %165, i64* %4
br label %168
166: ; preds = %157
%167 = load i64, i64* %9
store i64 %167, i64* %4
br label %168
168: ; preds = %166, %163
%169 = load i64, i64* %4
ret i64 %169
}

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