int _write(int fd, char *buf, int len) {
  int i = 0;
  while (i < len)
    *(char *)0x3f8 = buf[i++];
  return len;
}


x86 assembly (clang, -O0):
<_write>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1142 <_write+0x42>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x18(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%cl
mov    $0x3f8,%eax
mov    %cl,(%rax)
jmp    1115 <_write+0x15>
mov    -0x14(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<_write>:
mov    %edx,%eax
test   %edx,%edx
jle    11d8 <_write+0xd8>
mov    %eax,%r9d
cmp    $0x8,%eax
jb     1130 <_write+0x30>
lea    (%rsi,%r9,1),%rcx
cmp    $0x3f9,%rcx
jb     11d9 <_write+0xd9>
cmp    $0x3f9,%rsi
jae    11d9 <_write+0xd9>
xor    %edx,%edx
mov    %rdx,%r8
not    %r8
add    %r9,%r8
mov    %r9,%rdi
and    $0x7,%rdi
je     1165 <_write+0x65>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzbl (%rsi,%rdx,1),%ecx
add    $0x1,%rdx
mov    %cl,0x3f8
add    $0xffffffffffffffff,%rdi
jne    1150 <_write+0x50>
cmp    $0x7,%r8
jb     11d8 <_write+0xd8>
nopl   0x0(%rax,%rax,1)
movzbl (%rsi,%rdx,1),%ecx
mov    %cl,0x3f8
movzbl 0x1(%rsi,%rdx,1),%ecx
mov    %cl,0x3f8
movzbl 0x2(%rsi,%rdx,1),%ecx
mov    %cl,0x3f8
movzbl 0x3(%rsi,%rdx,1),%ecx
mov    %cl,0x3f8
movzbl 0x4(%rsi,%rdx,1),%ecx
mov    %cl,0x3f8
movzbl 0x5(%rsi,%rdx,1),%ecx
mov    %cl,0x3f8
movzbl 0x6(%rsi,%rdx,1),%ecx
mov    %cl,0x3f8
movzbl 0x7(%rsi,%rdx,1),%ecx
add    $0x8,%rdx
mov    %cl,0x3f8
cmp    %rdx,%r9
jne    1170 <_write+0x70>
ret
cmp    $0x20,%eax
jae    11e5 <_write+0xe5>
xor    %edx,%edx
jmp    12d8 <_write+0x1d8>
mov    %r9d,%edx
and    $0xffffffe0,%edx
lea    -0x20(%rdx),%rcx
mov    %rcx,%r10
shr    $0x5,%r10
add    $0x1,%r10
mov    %r10d,%r8d
and    $0x7,%r8d
cmp    $0xe0,%rcx
jae    1211 <_write+0x111>
xor    %edi,%edi
jmp    1299 <_write+0x199>
and    $0xfffffffffffffff8,%r10
xor    %edi,%edi
nopw   0x0(%rax,%rax,1)
movzbl 0x1f(%rsi,%rdi,1),%ecx
mov    %cl,0x3f8
movzbl 0x3f(%rsi,%rdi,1),%ecx
mov    %cl,0x3f8
movzbl 0x5f(%rsi,%rdi,1),%ecx
mov    %cl,0x3f8
movzbl 0x7f(%rsi,%rdi,1),%ecx
mov    %cl,0x3f8
movzbl 0x9f(%rsi,%rdi,1),%ecx
mov    %cl,0x3f8
movzbl 0xbf(%rsi,%rdi,1),%ecx
mov    %cl,0x3f8
movzbl 0xdf(%rsi,%rdi,1),%ecx
mov    %cl,0x3f8
movzbl 0xff(%rsi,%rdi,1),%ecx
mov    %cl,0x3f8
add    $0x100,%rdi
add    $0xfffffffffffffff8,%r10
jne    1220 <_write+0x120>
test   %r8,%r8
je     12c5 <_write+0x1c5>
lea    (%rdi,%rsi,1),%r10
add    $0x1f,%r10
shl    $0x5,%r8
xor    %edi,%edi
nopl   0x0(%rax)
movzbl (%r10,%rdi,1),%ecx
mov    %cl,0x3f8
add    $0x20,%rdi
cmp    %rdi,%r8
jne    12b0 <_write+0x1b0>
cmp    %r9,%rdx
je     11d8 <_write+0xd8>
test   $0x18,%r9b
je     1132 <_write+0x32>
mov    %rdx,%rdi
mov    %r9d,%edx
and    $0xfffffff8,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movzbl 0x7(%rsi,%rdi,1),%ecx
mov    %cl,0x3f8
add    $0x8,%rdi
cmp    %rdi,%rdx
jne    12f0 <_write+0x1f0>
cmp    %r9,%rdx
je     11d8 <_write+0xd8>
jmp    1132 <_write+0x32>

LLVM IR (-O0):
define i32 @_write(i32 %0, i8* %1, i32 %2) {
%4 = alloca i32
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i32
store i32 %0, i32* %4
store i8* %1, i8** %5
store i32 %2, i32* %6
store i32 0, i32* %7
br label %8
8: ; preds = %12, %3
%9 = load i32, i32* %7
%10 = load i32, i32* %6
%11 = icmp slt i32 %9, %10
br i1 %11, label %12, label %19
12: ; preds = %8
%13 = load i8*, i8** %5
%14 = load i32, i32* %7
%15 = add nsw i32 %14, 1
store i32 %15, i32* %7
%16 = sext i32 %14 to i64
%17 = getelementptr inbounds i8, i8* %13, i64 %16
%18 = load i8, i8* %17
store i8 %18, i8* inttoptr (i64 1016 to i8*)
br label %8
19: ; preds = %8
%20 = load i32, i32* %6
ret i32 %20
}

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