void write_memory(unsigned long phys_addr, void *addr, int len, int iosize,
                  unsigned long value) {
  switch (iosize) {
  case 1:
    while (len) {
      *(unsigned char *)addr = value;
      len -= iosize;
      addr += iosize;
    }
    break;
  case 2:
    while (len) {
      *(unsigned short *)addr = value;
      len -= iosize;
      addr += iosize;
    }
    break;
  case 4:
    while (len) {
      *(unsigned long *)addr = value;
      len -= iosize;
      addr += iosize;
    }
    break;
  }
}


x86 assembly (clang, -O0):
<write_memory>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x24(%rbp)
sub    $0x1,%eax
je     114c <write_memory+0x4c>
jmp    112a <write_memory+0x2a>
mov    -0x24(%rbp),%eax
sub    $0x2,%eax
je     118d <write_memory+0x8d>
jmp    113b <write_memory+0x3b>
mov    -0x24(%rbp),%eax
sub    $0x4,%eax
je     11d0 <write_memory+0xd0>
jmp    1210 <write_memory+0x110>
jmp    1151 <write_memory+0x51>
cmpl   $0x0,-0x14(%rbp)
je     1188 <write_memory+0x88>
mov    -0x20(%rbp),%rax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %cl,(%rax)
mov    -0x18(%rbp),%ecx
mov    -0x14(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x18(%rbp),%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
jmp    1151 <write_memory+0x51>
jmp    1210 <write_memory+0x110>
jmp    1192 <write_memory+0x92>
cmpl   $0x0,-0x14(%rbp)
je     11cb <write_memory+0xcb>
mov    -0x20(%rbp),%rax
mov    %ax,%cx
mov    -0x10(%rbp),%rax
mov    %cx,(%rax)
mov    -0x18(%rbp),%ecx
mov    -0x14(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x18(%rbp),%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
jmp    1192 <write_memory+0x92>
jmp    1210 <write_memory+0x110>
jmp    11d5 <write_memory+0xd5>
cmpl   $0x0,-0x14(%rbp)
je     120b <write_memory+0x10b>
mov    -0x20(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x18(%rbp),%ecx
mov    -0x14(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x18(%rbp),%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
jmp    11d5 <write_memory+0xd5>
jmp    1210 <write_memory+0x110>
pop    %rbp
ret

x86 assembly (clang, -O2):
<write_memory>:
push   %r14
push   %rbx
cmp    $0x1,%ecx
je     11a4 <write_memory+0xa4>
cmp    $0x2,%ecx
je     11be <write_memory+0xbe>
cmp    $0x4,%ecx
jne    141c <write_memory+0x31c>
test   %edx,%edx
je     141c <write_memory+0x31c>
lea    -0x4(%rdx),%eax
mov    %eax,%ecx
shr    $0x2,%ecx
lea    0x1(%rcx),%edi
test   $0x7,%dil
je     1161 <write_memory+0x61>
add    $0x1,%cl
movzbl %cl,%ecx
and    $0x7,%ecx
shl    $0x2,%rcx
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
mov    %r8,(%rsi,%rdi,1)
add    $0x4,%rdi
cmp    %edi,%ecx
jne    1150 <write_memory+0x50>
add    %rdi,%rsi
sub    %edi,%edx
cmp    $0x1c,%eax
jb     141c <write_memory+0x31c>
mov    %edx,%eax
xor    %ecx,%ecx
xchg   %ax,%ax
mov    %r8,(%rsi,%rcx,1)
mov    %r8,0x4(%rsi,%rcx,1)
mov    %r8,0x8(%rsi,%rcx,1)
mov    %r8,0xc(%rsi,%rcx,1)
mov    %r8,0x10(%rsi,%rcx,1)
mov    %r8,0x14(%rsi,%rcx,1)
mov    %r8,0x18(%rsi,%rcx,1)
mov    %r8,0x1c(%rsi,%rcx,1)
add    $0x20,%rcx
cmp    %ecx,%eax
jne    1170 <write_memory+0x70>
jmp    141c <write_memory+0x31c>
test   %edx,%edx
je     141c <write_memory+0x31c>
lea    -0x1(%rdx),%r11d
cmp    $0x7,%r11d
jae    120b <write_memory+0x10b>
mov    %rsi,%rax
jmp    1403 <write_memory+0x303>
test   %edx,%edx
je     141c <write_memory+0x31c>
lea    -0x2(%rdx),%eax
cmp    $0x1e,%eax
jb     12a7 <write_memory+0x1a7>
shr    %eax
add    $0x1,%eax
mov    %eax,%r9d
and    $0xfffffff0,%r9d
movd   %r8d,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
lea    -0x10(%r9),%rcx
mov    %rcx,%rdi
shr    $0x4,%rdi
add    $0x1,%rdi
mov    %edi,%ebx
and    $0x3,%ebx
cmp    $0x30,%rcx
jae    122a <write_memory+0x12a>
xor    %ecx,%ecx
jmp    1269 <write_memory+0x169>
movabs $0x1ffffffe0,%rcx
movzbl %r8b,%r9d
cmp    $0x1f,%r11d
jae    12c2 <write_memory+0x1c2>
xor    %edi,%edi
jmp    13cf <write_memory+0x2cf>
and    $0xfffffffffffffffc,%rdi
xor    %ecx,%ecx
movdqu %xmm0,(%rsi,%rcx,2)
movdqu %xmm0,0x10(%rsi,%rcx,2)
movdqu %xmm0,0x20(%rsi,%rcx,2)
movdqu %xmm0,0x30(%rsi,%rcx,2)
movdqu %xmm0,0x40(%rsi,%rcx,2)
movdqu %xmm0,0x50(%rsi,%rcx,2)
movdqu %xmm0,0x60(%rsi,%rcx,2)
movdqu %xmm0,0x70(%rsi,%rcx,2)
add    $0x40,%rcx
add    $0xfffffffffffffffc,%rdi
jne    1230 <write_memory+0x130>
test   %rbx,%rbx
je     1294 <write_memory+0x194>
lea    (%rsi,%rcx,2),%rcx
add    $0x10,%rcx
shl    $0x5,%rbx
xor    %edi,%edi
nopl   0x0(%rax)
movdqu %xmm0,-0x10(%rcx,%rdi,1)
movdqu %xmm0,(%rcx,%rdi,1)
add    $0x20,%rdi
cmp    %rdi,%rbx
jne    1280 <write_memory+0x180>
cmp    %rax,%r9
je     141c <write_memory+0x31c>
lea    (%rsi,%r9,2),%rsi
sub    %r9d,%edx
sub    %r9d,%edx
mov    %edx,%eax
xor    %ecx,%ecx
nopl   0x0(%rax,%rax,1)
mov    %r8w,(%rsi,%rcx,1)
add    $0x2,%rcx
cmp    %ecx,%eax
jne    12b0 <write_memory+0x1b0>
jmp    141c <write_memory+0x31c>
lea    0x1(%r11),%r10
mov    %r10,%rdi
and    %rcx,%rdi
movd   %r9d,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
pshufd $0x0,%xmm0,%xmm0
lea    -0x20(%rdi),%rax
mov    %rax,%rbx
shr    $0x5,%rbx
add    $0x1,%rbx
mov    %ebx,%r14d
and    $0x7,%r14d
cmp    $0xe0,%rax
jae    1304 <write_memory+0x204>
xor    %eax,%eax
jmp    1397 <write_memory+0x297>
and    $0xfffffffffffffff8,%rbx
xor    %eax,%eax
nopw   0x0(%rax,%rax,1)
movdqu %xmm0,(%rsi,%rax,1)
movdqu %xmm0,0x10(%rsi,%rax,1)
movdqu %xmm0,0x20(%rsi,%rax,1)
movdqu %xmm0,0x30(%rsi,%rax,1)
movdqu %xmm0,0x40(%rsi,%rax,1)
movdqu %xmm0,0x50(%rsi,%rax,1)
movdqu %xmm0,0x60(%rsi,%rax,1)
movdqu %xmm0,0x70(%rsi,%rax,1)
movdqu %xmm0,0x80(%rsi,%rax,1)
movdqu %xmm0,0x90(%rsi,%rax,1)
movdqu %xmm0,0xa0(%rsi,%rax,1)
movdqu %xmm0,0xb0(%rsi,%rax,1)
movdqu %xmm0,0xc0(%rsi,%rax,1)
movdqu %xmm0,0xd0(%rsi,%rax,1)
movdqu %xmm0,0xe0(%rsi,%rax,1)
movdqu %xmm0,0xf0(%rsi,%rax,1)
add    $0x100,%rax
add    $0xfffffffffffffff8,%rbx
jne    1310 <write_memory+0x210>
test   %r14,%r14
je     13c4 <write_memory+0x2c4>
add    %rsi,%rax
add    $0x10,%rax
shl    $0x5,%r14
xor    %ebx,%ebx
nopl   0x0(%rax)
movdqu %xmm0,-0x10(%rax,%rbx,1)
movdqu %xmm0,(%rax,%rbx,1)
add    $0x20,%rbx
cmp    %rbx,%r14
jne    13b0 <write_memory+0x2b0>
cmp    %rdi,%r10
je     141c <write_memory+0x31c>
test   $0x18,%r10b
je     1420 <write_memory+0x320>
add    $0x1,%r11
add    $0x18,%rcx
and    %r11,%rcx
lea    (%rsi,%rcx,1),%rax
sub    %ecx,%edx
movd   %r9d,%xmm0
punpcklbw %xmm0,%xmm0
pshuflw $0x0,%xmm0,%xmm0
xchg   %ax,%ax
movq   %xmm0,(%rsi,%rdi,1)
add    $0x8,%rdi
cmp    %rdi,%rcx
jne    13f0 <write_memory+0x2f0>
cmp    %rcx,%r11
je     141c <write_memory+0x31c>
mov    %edx,%ecx
xor    %edx,%edx
nopw   0x0(%rax,%rax,1)
mov    %r8b,(%rax,%rdx,1)
add    $0x1,%rdx
cmp    %edx,%ecx
jne    1410 <write_memory+0x310>
pop    %rbx
pop    %r14
ret
sub    %edi,%edx
add    %rdi,%rsi
jmp    11b6 <write_memory+0xb6>

LLVM IR (-O0):
define void @write_memory(i64 %0, i8* %1, i32 %2, i32 %3, i64 %4) {
%6 = alloca i64
%7 = alloca i8*
%8 = alloca i32
%9 = alloca i32
%10 = alloca i64
store i64 %0, i64* %6
store i8* %1, i8** %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store i64 %4, i64* %10
%11 = load i32, i32* %9
switch i32 %11, label %61 [
i32 1, label %12
i32 2, label %28
i32 4, label %45
]
12: ; preds = %5
br label %13
13: ; preds = %16, %12
%14 = load i32, i32* %8
%15 = icmp ne i32 %14, 0
br i1 %15, label %16, label %27
16: ; preds = %13
%17 = load i64, i64* %10
%18 = trunc i64 %17 to i8
%19 = load i8*, i8** %7
store i8 %18, i8* %19
%20 = load i32, i32* %9
%21 = load i32, i32* %8
%22 = sub nsw i32 %21, %20
store i32 %22, i32* %8
%23 = load i32, i32* %9
%24 = load i8*, i8** %7
%25 = sext i32 %23 to i64
%26 = getelementptr i8, i8* %24, i64 %25
store i8* %26, i8** %7
br label %13
27: ; preds = %13
br label %61
28: ; preds = %5
br label %29
29: ; preds = %32, %28
%30 = load i32, i32* %8
%31 = icmp ne i32 %30, 0
br i1 %31, label %32, label %44
32: ; preds = %29
%33 = load i64, i64* %10
%34 = trunc i64 %33 to i16
%35 = load i8*, i8** %7
%36 = bitcast i8* %35 to i16*
store i16 %34, i16* %36
%37 = load i32, i32* %9
%38 = load i32, i32* %8
%39 = sub nsw i32 %38, %37
store i32 %39, i32* %8
%40 = load i32, i32* %9
%41 = load i8*, i8** %7
%42 = sext i32 %40 to i64
%43 = getelementptr i8, i8* %41, i64 %42
store i8* %43, i8** %7
br label %29
44: ; preds = %29
br label %61
45: ; preds = %5
br label %46
46: ; preds = %49, %45
%47 = load i32, i32* %8
%48 = icmp ne i32 %47, 0
br i1 %48, label %49, label %60
49: ; preds = %46
%50 = load i64, i64* %10
%51 = load i8*, i8** %7
%52 = bitcast i8* %51 to i64*
store i64 %50, i64* %52
%53 = load i32, i32* %9
%54 = load i32, i32* %8
%55 = sub nsw i32 %54, %53
store i32 %55, i32* %8
%56 = load i32, i32* %9
%57 = load i8*, i8** %7
%58 = sext i32 %56 to i64
%59 = getelementptr i8, i8* %57, i64 %58
store i8* %59, i8** %7
br label %46
60: ; preds = %46
br label %61
61: ; preds = %5, %60, %44, %27
ret void
}

LLVM IR (-O2):
define void @write_memory(i64 %0, i8* nocapture writeonly %1, i32 %2, i32 %3, i64 %4) {
switch i32 %3, label %247 [
i32 1, label %102
i32 2, label %27
i32 4, label %6
]
6: ; preds = %5
%7 = icmp eq i32 %2, 0
br i1 %7, label %247, label %8
8: ; preds = %6
%9 = add i32 %2, -4
%10 = lshr i32 %9, 2
%11 = add nuw nsw i32 %10, 1
%12 = and i32 %11, 7
%13 = icmp eq i32 %12, 0
br i1 %13, label %23, label %14
14: ; preds = %8, %14
%15 = phi i8* [ %20, %14 ], [ %1, %8 ]
%16 = phi i32 [ %19, %14 ], [ %2, %8 ]
%17 = phi i32 [ %21, %14 ], [ 0, %8 ]
%18 = bitcast i8* %15 to i64*
store i64 %4, i64* %18
%19 = add nsw i32 %16, -4
%20 = getelementptr i8, i8* %15, i64 4
%21 = add i32 %17, 1
%22 = icmp eq i32 %21, %12
br i1 %22, label %23, label %14
23: ; preds = %14, %8
%24 = phi i8* [ %1, %8 ], [ %20, %14 ]
%25 = phi i32 [ %2, %8 ], [ %19, %14 ]
%26 = icmp ult i32 %9, 28
br i1 %26, label %247, label %226
27: ; preds = %5
%28 = icmp eq i32 %2, 0
br i1 %28, label %247, label %29
29: ; preds = %27
%30 = trunc i64 %4 to i16
%31 = add i32 %2, -2
%32 = lshr i32 %31, 1
%33 = add nuw i32 %32, 1
%34 = zext i32 %33 to i64
%35 = icmp ult i32 %31, 30
br i1 %35, label %99, label %36
36: ; preds = %29
%37 = and i64 %34, 4294967280
%38 = shl nuw nsw i64 %37, 1
%39 = getelementptr i8, i8* %1, i64 %38
%40 = trunc i64 %37 to i32
%41 = mul i32 %40, -2
%42 = add i32 %41, %2
%43 = insertelement <8 x i16> poison, i16 %30, i64 0
%44 = shufflevector <8 x i16> %43, <8 x i16> poison, <8 x i32> zeroinitializer
%45 = insertelement <8 x i16> poison, i16 %30, i64 0
%46 = shufflevector <8 x i16> %45, <8 x i16> poison, <8 x i32> zeroinitializer
%47 = add nsw i64 %37, -16
%48 = lshr exact i64 %47, 4
%49 = add nuw nsw i64 %48, 1
%50 = and i64 %49, 3
%51 = icmp ult i64 %47, 48
br i1 %51, label %83, label %52
52: ; preds = %36
%53 = and i64 %49, 2305843009213693948
br label %54
54: ; preds = %54, %52
%55 = phi i64 [ 0, %52 ], [ %80, %54 ]
%56 = phi i64 [ 0, %52 ], [ %81, %54 ]
%57 = shl i64 %55, 1
%58 = getelementptr i8, i8* %1, i64 %57
%59 = bitcast i8* %58 to <8 x i16>*
store <8 x i16> %44, <8 x i16>* %59
%60 = getelementptr i8, i8* %58, i64 16
%61 = bitcast i8* %60 to <8 x i16>*
store <8 x i16> %46, <8 x i16>* %61
%62 = shl i64 %55, 1
%63 = or i64 %62, 32
%64 = getelementptr i8, i8* %1, i64 %63
%65 = bitcast i8* %64 to <8 x i16>*
store <8 x i16> %44, <8 x i16>* %65
%66 = getelementptr i8, i8* %64, i64 16
%67 = bitcast i8* %66 to <8 x i16>*
store <8 x i16> %46, <8 x i16>* %67
%68 = shl i64 %55, 1
%69 = or i64 %68, 64
%70 = getelementptr i8, i8* %1, i64 %69
%71 = bitcast i8* %70 to <8 x i16>*
store <8 x i16> %44, <8 x i16>* %71
%72 = getelementptr i8, i8* %70, i64 16
%73 = bitcast i8* %72 to <8 x i16>*
store <8 x i16> %46, <8 x i16>* %73
%74 = shl i64 %55, 1
%75 = or i64 %74, 96
%76 = getelementptr i8, i8* %1, i64 %75
%77 = bitcast i8* %76 to <8 x i16>*
store <8 x i16> %44, <8 x i16>* %77
%78 = getelementptr i8, i8* %76, i64 16
%79 = bitcast i8* %78 to <8 x i16>*
store <8 x i16> %46, <8 x i16>* %79
%80 = add nuw i64 %55, 64
%81 = add i64 %56, 4
%82 = icmp eq i64 %81, %53
br i1 %82, label %83, label %54
83: ; preds = %54, %36
%84 = phi i64 [ 0, %36 ], [ %80, %54 ]
%85 = icmp eq i64 %50, 0
br i1 %85, label %97, label %86
86: ; preds = %83, %86
%87 = phi i64 [ %94, %86 ], [ %84, %83 ]
%88 = phi i64 [ %95, %86 ], [ 0, %83 ]
%89 = shl i64 %87, 1
%90 = getelementptr i8, i8* %1, i64 %89
%91 = bitcast i8* %90 to <8 x i16>*
store <8 x i16> %44, <8 x i16>* %91
%92 = getelementptr i8, i8* %90, i64 16
%93 = bitcast i8* %92 to <8 x i16>*
store <8 x i16> %46, <8 x i16>* %93
%94 = add nuw i64 %87, 16
%95 = add i64 %88, 1
%96 = icmp eq i64 %95, %50
br i1 %96, label %97, label %86
97: ; preds = %86, %83
%98 = icmp eq i64 %37, %34
br i1 %98, label %247, label %99
99: ; preds = %29, %97
%100 = phi i8* [ %1, %29 ], [ %39, %97 ]
%101 = phi i32 [ %2, %29 ], [ %42, %97 ]
br label %219
102: ; preds = %5
%103 = icmp eq i32 %2, 0
br i1 %103, label %247, label %104
104: ; preds = %102
%105 = trunc i64 %4 to i8
%106 = add i32 %2, -1
%107 = zext i32 %106 to i64
%108 = add nuw nsw i64 %107, 1
%109 = icmp ult i32 %106, 7
br i1 %109, label %210, label %110
110: ; preds = %104
%111 = icmp ult i32 %106, 31
br i1 %111, label %191, label %112
112: ; preds = %110
%113 = and i64 %108, 8589934560
%114 = insertelement <16 x i8> poison, i8 %105, i64 0
%115 = shufflevector <16 x i8> %114, <16 x i8> poison, <16 x i32> zeroinitializer
%116 = insertelement <16 x i8> poison, i8 %105, i64 0
%117 = shufflevector <16 x i8> %116, <16 x i8> poison, <16 x i32> zeroinitializer
%118 = add nsw i64 %113, -32
%119 = lshr exact i64 %118, 5
%120 = add nuw nsw i64 %119, 1
%121 = and i64 %120, 7
%122 = icmp ult i64 %118, 224
br i1 %122, label %170, label %123
123: ; preds = %112
%124 = and i64 %120, 1152921504606846968
br label %125
125: ; preds = %125, %123
%126 = phi i64 [ 0, %123 ], [ %167, %125 ]
%127 = phi i64 [ 0, %123 ], [ %168, %125 ]
%128 = getelementptr i8, i8* %1, i64 %126
%129 = bitcast i8* %128 to <16 x i8>*
store <16 x i8> %115, <16 x i8>* %129
%130 = getelementptr i8, i8* %128, i64 16
%131 = bitcast i8* %130 to <16 x i8>*
store <16 x i8> %117, <16 x i8>* %131
%132 = or i64 %126, 32
%133 = getelementptr i8, i8* %1, i64 %132
%134 = bitcast i8* %133 to <16 x i8>*
store <16 x i8> %115, <16 x i8>* %134
%135 = getelementptr i8, i8* %133, i64 16
%136 = bitcast i8* %135 to <16 x i8>*
store <16 x i8> %117, <16 x i8>* %136
%137 = or i64 %126, 64
%138 = getelementptr i8, i8* %1, i64 %137
%139 = bitcast i8* %138 to <16 x i8>*
store <16 x i8> %115, <16 x i8>* %139
%140 = getelementptr i8, i8* %138, i64 16
%141 = bitcast i8* %140 to <16 x i8>*
store <16 x i8> %117, <16 x i8>* %141
%142 = or i64 %126, 96
%143 = getelementptr i8, i8* %1, i64 %142
%144 = bitcast i8* %143 to <16 x i8>*
store <16 x i8> %115, <16 x i8>* %144
%145 = getelementptr i8, i8* %143, i64 16
%146 = bitcast i8* %145 to <16 x i8>*
store <16 x i8> %117, <16 x i8>* %146
%147 = or i64 %126, 128
%148 = getelementptr i8, i8* %1, i64 %147
%149 = bitcast i8* %148 to <16 x i8>*
store <16 x i8> %115, <16 x i8>* %149
%150 = getelementptr i8, i8* %148, i64 16
%151 = bitcast i8* %150 to <16 x i8>*
store <16 x i8> %117, <16 x i8>* %151
%152 = or i64 %126, 160
%153 = getelementptr i8, i8* %1, i64 %152
%154 = bitcast i8* %153 to <16 x i8>*
store <16 x i8> %115, <16 x i8>* %154
%155 = getelementptr i8, i8* %153, i64 16
%156 = bitcast i8* %155 to <16 x i8>*
store <16 x i8> %117, <16 x i8>* %156
%157 = or i64 %126, 192
%158 = getelementptr i8, i8* %1, i64 %157
%159 = bitcast i8* %158 to <16 x i8>*
store <16 x i8> %115, <16 x i8>* %159
%160 = getelementptr i8, i8* %158, i64 16
%161 = bitcast i8* %160 to <16 x i8>*
store <16 x i8> %117, <16 x i8>* %161
%162 = or i64 %126, 224
%163 = getelementptr i8, i8* %1, i64 %162
%164 = bitcast i8* %163 to <16 x i8>*
store <16 x i8> %115, <16 x i8>* %164
%165 = getelementptr i8, i8* %163, i64 16
%166 = bitcast i8* %165 to <16 x i8>*
store <16 x i8> %117, <16 x i8>* %166
%167 = add nuw i64 %126, 256
%168 = add i64 %127, 8
%169 = icmp eq i64 %168, %124
br i1 %169, label %170, label %125
170: ; preds = %125, %112
%171 = phi i64 [ 0, %112 ], [ %167, %125 ]
%172 = icmp eq i64 %121, 0
br i1 %172, label %183, label %173
173: ; preds = %170, %173
%174 = phi i64 [ %180, %173 ], [ %171, %170 ]
%175 = phi i64 [ %181, %173 ], [ 0, %170 ]
%176 = getelementptr i8, i8* %1, i64 %174
%177 = bitcast i8* %176 to <16 x i8>*
store <16 x i8> %115, <16 x i8>* %177
%178 = getelementptr i8, i8* %176, i64 16
%179 = bitcast i8* %178 to <16 x i8>*
store <16 x i8> %117, <16 x i8>* %179
%180 = add nuw i64 %174, 32
%181 = add i64 %175, 1
%182 = icmp eq i64 %181, %121
br i1 %182, label %183, label %173
183: ; preds = %173, %170
%184 = icmp eq i64 %108, %113
br i1 %184, label %247, label %185
185: ; preds = %183
%186 = trunc i64 %113 to i32
%187 = sub i32 %2, %186
%188 = getelementptr i8, i8* %1, i64 %113
%189 = and i64 %108, 24
%190 = icmp eq i64 %189, 0
br i1 %190, label %210, label %191
191: ; preds = %110, %185
%192 = phi i64 [ %113, %185 ], [ 0, %110 ]
%193 = add i32 %2, -1
%194 = zext i32 %193 to i64
%195 = add nuw nsw i64 %194, 1
%196 = and i64 %195, 8589934584
%197 = getelementptr i8, i8* %1, i64 %196
%198 = trunc i64 %196 to i32
%199 = sub i32 %2, %198
%200 = insertelement <8 x i8> poison, i8 %105, i64 0
%201 = shufflevector <8 x i8> %200, <8 x i8> poison, <8 x i32> zeroinitializer
br label %202
202: ; preds = %202, %191
%203 = phi i64 [ %192, %191 ], [ %206, %202 ]
%204 = getelementptr i8, i8* %1, i64 %203
%205 = bitcast i8* %204 to <8 x i8>*
store <8 x i8> %201, <8 x i8>* %205
%206 = add nuw i64 %203, 8
%207 = icmp eq i64 %206, %196
br i1 %207, label %208, label %202
208: ; preds = %202
%209 = icmp eq i64 %195, %196
br i1 %209, label %247, label %210
210: ; preds = %104, %185, %208
%211 = phi i8* [ %1, %104 ], [ %188, %185 ], [ %197, %208 ]
%212 = phi i32 [ %2, %104 ], [ %187, %185 ], [ %199, %208 ]
br label %213
213: ; preds = %210, %213
%214 = phi i8* [ %217, %213 ], [ %211, %210 ]
%215 = phi i32 [ %216, %213 ], [ %212, %210 ]
store i8 %105, i8* %214
%216 = add nsw i32 %215, -1
%217 = getelementptr i8, i8* %214, i64 1
%218 = icmp eq i32 %216, 0
br i1 %218, label %247, label %213
219: ; preds = %99, %219
%220 = phi i8* [ %224, %219 ], [ %100, %99 ]
%221 = phi i32 [ %223, %219 ], [ %101, %99 ]
%222 = bitcast i8* %220 to i16*
store i16 %30, i16* %222
%223 = add nsw i32 %221, -2
%224 = getelementptr i8, i8* %220, i64 2
%225 = icmp eq i32 %223, 0
br i1 %225, label %247, label %219
226: ; preds = %23, %226
%227 = phi i8* [ %245, %226 ], [ %24, %23 ]
%228 = phi i32 [ %244, %226 ], [ %25, %23 ]
%229 = bitcast i8* %227 to i64*
store i64 %4, i64* %229
%230 = getelementptr i8, i8* %227, i64 4
%231 = bitcast i8* %230 to i64*
store i64 %4, i64* %231
%232 = getelementptr i8, i8* %227, i64 8
%233 = bitcast i8* %232 to i64*
store i64 %4, i64* %233
%234 = getelementptr i8, i8* %227, i64 12
%235 = bitcast i8* %234 to i64*
store i64 %4, i64* %235
%236 = getelementptr i8, i8* %227, i64 16
%237 = bitcast i8* %236 to i64*
store i64 %4, i64* %237
%238 = getelementptr i8, i8* %227, i64 20
%239 = bitcast i8* %238 to i64*
store i64 %4, i64* %239
%240 = getelementptr i8, i8* %227, i64 24
%241 = bitcast i8* %240 to i64*
store i64 %4, i64* %241
%242 = getelementptr i8, i8* %227, i64 28
%243 = bitcast i8* %242 to i64*
store i64 %4, i64* %243
%244 = add nsw i32 %228, -32
%245 = getelementptr i8, i8* %227, i64 32
%246 = icmp eq i32 %244, 0
br i1 %246, label %247, label %226
247: ; preds = %23, %226, %219, %213, %97, %183, %208, %6, %27, %102, %5
ret void
}