#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 */
typedef int /*<<< orphan*/ FILE;

/* Variables and functions */
int /*<<< orphan*/ fread(char *, int, int, int /*<<< orphan*/ *);
int /*<<< orphan*/ fwrite(char *, int, int, int /*<<< orphan*/ *);
void convert(FILE *fi, FILE *fo) {
  char inbuf[0x1000];
  char outbuf[0x1000];
  fread(inbuf, 0x1000, 1, fi);
  for (int c = 0; c < 256; ++c) {
    for (int l = 0; l < 16; ++l) {
      outbuf[c * 16 + l] = inbuf[c + 256 * l];
    }
  }
  fwrite(outbuf, 0x1000, 1, fo);
}


x86 assembly (clang, -O0):
<convert>:
push   %rbp
mov    %rsp,%rbp
sub    $0x2020,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
lea    -0x1010(%rbp),%rdi
mov    -0x8(%rbp),%rcx
mov    $0x1000,%esi
mov    $0x1,%edx
call   1030 <fread@plt>
movl   $0x0,-0x2014(%rbp)
cmpl   $0x100,-0x2014(%rbp)
jge    11dd <convert+0xbd>
movl   $0x0,-0x2018(%rbp)
cmpl   $0x10,-0x2018(%rbp)
jge    11c4 <convert+0xa4>
mov    -0x2014(%rbp),%eax
mov    -0x2018(%rbp),%ecx
shl    $0x8,%ecx
add    %ecx,%eax
cltq
mov    -0x1010(%rbp,%rax,1),%cl
mov    -0x2014(%rbp),%eax
shl    $0x4,%eax
add    -0x2018(%rbp),%eax
cltq
mov    %cl,-0x2010(%rbp,%rax,1)
mov    -0x2018(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2018(%rbp)
jmp    1171 <convert+0x51>
jmp    11c9 <convert+0xa9>
mov    -0x2014(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2014(%rbp)
jmp    1157 <convert+0x37>
lea    -0x2010(%rbp),%rdi
mov    -0x10(%rbp),%rcx
mov    $0x1000,%esi
mov    $0x1,%edx
call   1040 <fwrite@plt>
add    $0x2020,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<convert>:
push   %rbx
sub    $0x2000,%rsp
mov    %rsi,%rbx
mov    %rdi,%rcx
mov    %rsp,%rdi
mov    $0x1000,%esi
mov    $0x1,%edx
call   1030 <fread@plt>
lea    0x100f(%rsp),%rax
mov    $0xffffffffffffff00,%rcx
nop
movzbl 0x100(%rsp,%rcx,1),%edx
mov    %dl,-0xf(%rax)
movzbl 0x200(%rsp,%rcx,1),%edx
mov    %dl,-0xe(%rax)
movzbl 0x300(%rsp,%rcx,1),%edx
mov    %dl,-0xd(%rax)
movzbl 0x400(%rsp,%rcx,1),%edx
mov    %dl,-0xc(%rax)
movzbl 0x500(%rsp,%rcx,1),%edx
mov    %dl,-0xb(%rax)
movzbl 0x600(%rsp,%rcx,1),%edx
mov    %dl,-0xa(%rax)
movzbl 0x700(%rsp,%rcx,1),%edx
mov    %dl,-0x9(%rax)
movzbl 0x800(%rsp,%rcx,1),%edx
mov    %dl,-0x8(%rax)
movzbl 0x900(%rsp,%rcx,1),%edx
mov    %dl,-0x7(%rax)
movzbl 0xa00(%rsp,%rcx,1),%edx
mov    %dl,-0x6(%rax)
movzbl 0xb00(%rsp,%rcx,1),%edx
mov    %dl,-0x5(%rax)
movzbl 0xc00(%rsp,%rcx,1),%edx
mov    %dl,-0x4(%rax)
movzbl 0xd00(%rsp,%rcx,1),%edx
mov    %dl,-0x3(%rax)
movzbl 0xe00(%rsp,%rcx,1),%edx
mov    %dl,-0x2(%rax)
movzbl 0xf00(%rsp,%rcx,1),%edx
mov    %dl,-0x1(%rax)
movzbl 0x1000(%rsp,%rcx,1),%edx
mov    %dl,(%rax)
add    $0x10,%rax
inc    %rcx
jne    1150 <convert+0x30>
lea    0x1000(%rsp),%rdi
mov    $0x1000,%esi
mov    $0x1,%edx
mov    %rbx,%rcx
call   1040 <fwrite@plt>
add    $0x2000,%rsp
pop    %rbx
ret

LLVM IR (-O0):
define void @convert(i32* %0, i32* %1) {
%3 = alloca i32*
%4 = alloca i32*
%5 = alloca [4096 x i8]
%6 = alloca [4096 x i8]
%7 = alloca i32
%8 = alloca i32
store i32* %0, i32** %3
store i32* %1, i32** %4
%9 = getelementptr inbounds [4096 x i8], [4096 x i8]* %5, i64 0, i64 0
%10 = load i32*, i32** %3
%11 = call i32 @fread(i8* %9, i32 4096, i32 1, i32* %10)
store i32 0, i32* %7
br label %12
12: ; preds = %37, %2
%13 = load i32, i32* %7
%14 = icmp slt i32 %13, 256
br i1 %14, label %15, label %40
15: ; preds = %12
store i32 0, i32* %8
br label %16
16: ; preds = %33, %15
%17 = load i32, i32* %8
%18 = icmp slt i32 %17, 16
br i1 %18, label %19, label %36
19: ; preds = %16
%20 = load i32, i32* %7
%21 = load i32, i32* %8
%22 = mul nsw i32 256, %21
%23 = add nsw i32 %20, %22
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds [4096 x i8], [4096 x i8]* %5, i64 0, i64 %24
%26 = load i8, i8* %25
%27 = load i32, i32* %7
%28 = mul nsw i32 %27, 16
%29 = load i32, i32* %8
%30 = add nsw i32 %28, %29
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds [4096 x i8], [4096 x i8]* %6, i64 0, i64 %31
store i8 %26, i8* %32
br label %33
33: ; preds = %19
%34 = load i32, i32* %8
%35 = add nsw i32 %34, 1
store i32 %35, i32* %8
br label %16
36: ; preds = %16
br label %37
37: ; preds = %36
%38 = load i32, i32* %7
%39 = add nsw i32 %38, 1
store i32 %39, i32* %7
br label %12
40: ; preds = %12
%41 = getelementptr inbounds [4096 x i8], [4096 x i8]* %6, i64 0, i64 0
%42 = load i32*, i32** %4
%43 = call i32 @fwrite(i8* %41, i32 4096, i32 1, i32* %42)
ret void
}

LLVM IR (-O2):
define void @convert(i32* nocapture %0, i32* nocapture %1) {
%3 = alloca [4096 x i8]
%4 = alloca [4096 x i8]
%5 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 0
%6 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 0
%7 = call i32 @fread(i8* %5, i32 4096, i32 1, i32* %0)
br label %8
8: ; preds = %2, %8
%9 = phi i64 [ 0, %2 ], [ %89, %8 ]
%10 = shl nsw i64 %9, 4
%11 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %9
%12 = load i8, i8* %11
%13 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %10
store i8 %12, i8* %13
%14 = add nuw nsw i64 %9, 256
%15 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %14
%16 = load i8, i8* %15
%17 = or i64 %10, 1
%18 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %17
store i8 %16, i8* %18
%19 = add nuw nsw i64 %9, 512
%20 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %19
%21 = load i8, i8* %20
%22 = or i64 %10, 2
%23 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %22
store i8 %21, i8* %23
%24 = add nuw nsw i64 %9, 768
%25 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %24
%26 = load i8, i8* %25
%27 = or i64 %10, 3
%28 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %27
store i8 %26, i8* %28
%29 = add nuw nsw i64 %9, 1024
%30 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %29
%31 = load i8, i8* %30
%32 = or i64 %10, 4
%33 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %32
store i8 %31, i8* %33
%34 = add nuw nsw i64 %9, 1280
%35 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %34
%36 = load i8, i8* %35
%37 = or i64 %10, 5
%38 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %37
store i8 %36, i8* %38
%39 = add nuw nsw i64 %9, 1536
%40 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %39
%41 = load i8, i8* %40
%42 = or i64 %10, 6
%43 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %42
store i8 %41, i8* %43
%44 = add nuw nsw i64 %9, 1792
%45 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %44
%46 = load i8, i8* %45
%47 = or i64 %10, 7
%48 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %47
store i8 %46, i8* %48
%49 = add nuw nsw i64 %9, 2048
%50 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %49
%51 = load i8, i8* %50
%52 = or i64 %10, 8
%53 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %52
store i8 %51, i8* %53
%54 = add nuw nsw i64 %9, 2304
%55 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %54
%56 = load i8, i8* %55
%57 = or i64 %10, 9
%58 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %57
store i8 %56, i8* %58
%59 = add nuw nsw i64 %9, 2560
%60 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %59
%61 = load i8, i8* %60
%62 = or i64 %10, 10
%63 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %62
store i8 %61, i8* %63
%64 = add nuw nsw i64 %9, 2816
%65 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %64
%66 = load i8, i8* %65
%67 = or i64 %10, 11
%68 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %67
store i8 %66, i8* %68
%69 = add nuw nsw i64 %9, 3072
%70 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %69
%71 = load i8, i8* %70
%72 = or i64 %10, 12
%73 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %72
store i8 %71, i8* %73
%74 = add nuw nsw i64 %9, 3328
%75 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %74
%76 = load i8, i8* %75
%77 = or i64 %10, 13
%78 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %77
store i8 %76, i8* %78
%79 = add nuw nsw i64 %9, 3584
%80 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %79
%81 = load i8, i8* %80
%82 = or i64 %10, 14
%83 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %82
store i8 %81, i8* %83
%84 = add nuw nsw i64 %9, 3840
%85 = getelementptr inbounds [4096 x i8], [4096 x i8]* %3, i64 0, i64 %84
%86 = load i8, i8* %85
%87 = or i64 %10, 15
%88 = getelementptr inbounds [4096 x i8], [4096 x i8]* %4, i64 0, i64 %87
store i8 %86, i8* %88
%89 = add nuw nsw i64 %9, 1
%90 = icmp eq i64 %89, 256
br i1 %90, label %91, label %8
91: ; preds = %8
%92 = call i32 @fwrite(i8* %6, i32 4096, i32 1, i32* %1)
ret void
}