#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 scalar_t__ uint8_t;
typedef int /*<<< orphan*/ uint64_t;
typedef scalar_t__ uint16_t;
typedef scalar_t__ int16_t;

/* Variables and functions */
uint8_t *binary_str(uint8_t *buffer, uint64_t value, uint16_t size) {
  uint8_t *buffer_ptr, *value_ptr, bit;
  int16_t i, j;
  buffer_ptr = buffer;
  value_ptr = (uint8_t *)&value;
  for (i = size - 1; i >= 0; i--)
    for (j = 7; j >= 0; j--)
      *buffer_ptr++ = ((*(value_ptr + i) >> j & 1) == 0) ? '0' : '1';
  *buffer_ptr = 0;
  return buffer;
}


x86 assembly (clang, -O0):
<binary_str>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
lea    -0xc(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
jl     11ad <binary_str+0xad>
movq   $0x7,-0x40(%rbp)
cmpq   $0x0,-0x40(%rbp)
jl     1197 <binary_str+0x97>
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x40(%rbp),%rcx
sar    %cl,%rdx
and    $0x1,%rdx
mov    $0x31,%eax
mov    $0x30,%ecx
cmp    $0x0,%rdx
cmove  %ecx,%eax
movslq %eax,%rcx
mov    -0x20(%rbp),%rax
mov    %rax,%rdx
add    $0x8,%rdx
mov    %rdx,-0x20(%rbp)
mov    %rcx,(%rax)
mov    -0x40(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x40(%rbp)
jmp    113e <binary_str+0x3e>
jmp    119c <binary_str+0x9c>
mov    -0x38(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x38(%rbp)
jmp    112b <binary_str+0x2b>
mov    -0x20(%rbp),%rax
movq   $0x0,(%rax)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<binary_str>:
push   %r15
push   %r14
push   %rbx
mov    %rdi,%rax
mov    %rdi,%rcx
test   %rdx,%rdx
jle    1239 <binary_str+0x139>
mov    %esi,%r15d
mov    %r15d,%ecx
and    $0x80,%ecx
cmp    $0x1,%rcx
mov    $0x31,%r8d
sbb    $0x0,%r8
mov    %r15d,%ecx
and    $0x40,%ecx
cmp    $0x1,%rcx
mov    $0x31,%r9d
sbb    $0x0,%r9
mov    %r15d,%ecx
and    $0x20,%ecx
cmp    $0x1,%rcx
mov    $0x31,%r10d
sbb    $0x0,%r10
mov    $0x31,%r11d
mov    %r15d,%ecx
and    $0x10,%ecx
cmp    $0x1,%rcx
mov    $0x31,%r14d
sbb    $0x0,%r14
mov    %r15d,%ecx
and    $0x8,%ecx
cmp    $0x1,%rcx
mov    $0x31,%edi
sbb    $0x0,%rdi
mov    %r15d,%ecx
and    $0x4,%ecx
cmp    $0x1,%rcx
mov    $0x31,%ebx
sbb    $0x0,%rbx
mov    %r15d,%ecx
and    $0x2,%ecx
cmp    $0x1,%rcx
sbb    $0x0,%r11
and    $0x1,%r15d
or     $0x30,%r15
mov    %rdx,%rsi
mov    %rax,%rcx
test   $0x1,%dl
je     11de <binary_str+0xde>
mov    %r8,(%rax)
mov    %r9,0x8(%rax)
mov    %r10,0x10(%rax)
mov    %r14,0x18(%rax)
mov    %rdi,0x20(%rax)
mov    %rbx,0x28(%rax)
mov    %r11,0x30(%rax)
lea    0x40(%rax),%rcx
mov    %r15,0x38(%rax)
lea    -0x1(%rdx),%rsi
cmp    $0x1,%rdx
je     1239 <binary_str+0x139>
add    $0xffffffffffffffff,%rsi
nopl   0x0(%rax,%rax,1)
mov    %r8,(%rcx)
mov    %r9,0x8(%rcx)
mov    %r10,0x10(%rcx)
mov    %r14,0x18(%rcx)
mov    %rdi,0x20(%rcx)
mov    %rbx,0x28(%rcx)
mov    %r11,0x30(%rcx)
mov    %r15,0x38(%rcx)
mov    %r8,0x40(%rcx)
mov    %r9,0x48(%rcx)
mov    %r10,0x50(%rcx)
mov    %r14,0x58(%rcx)
mov    %rdi,0x60(%rcx)
mov    %rbx,0x68(%rcx)
mov    %r11,0x70(%rcx)
mov    %r15,0x78(%rcx)
sub    $0xffffffffffffff80,%rcx
add    $0xfffffffffffffffe,%rsi
jb     11f0 <binary_str+0xf0>
movq   $0x0,(%rcx)
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define i64* @binary_str(i64* %0, i32 %1, i64 %2) {
%4 = alloca i64*
%5 = alloca i32
%6 = alloca i64
%7 = alloca i64*
%8 = alloca i64*
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
store i64* %0, i64** %4
store i32 %1, i32* %5
store i64 %2, i64* %6
%12 = load i64*, i64** %4
store i64* %12, i64** %7
%13 = bitcast i32* %5 to i64*
store i64* %13, i64** %8
%14 = load i64, i64* %6
%15 = sub nsw i64 %14, 1
store i64 %15, i64* %10
br label %16
16: ; preds = %41, %3
%17 = load i64, i64* %10
%18 = icmp sge i64 %17, 0
br i1 %18, label %19, label %44
19: ; preds = %16
store i64 7, i64* %11
br label %20
20: ; preds = %37, %19
%21 = load i64, i64* %11
%22 = icmp sge i64 %21, 0
br i1 %22, label %23, label %40
23: ; preds = %20
%24 = load i64*, i64** %8
%25 = load i64, i64* %10
%26 = getelementptr inbounds i64, i64* %24, i64 %25
%27 = load i64, i64* %26
%28 = load i64, i64* %11
%29 = ashr i64 %27, %28
%30 = and i64 %29, 1
%31 = icmp eq i64 %30, 0
%32 = zext i1 %31 to i64
%33 = select i1 %31, i32 48, i32 49
%34 = sext i32 %33 to i64
%35 = load i64*, i64** %7
%36 = getelementptr inbounds i64, i64* %35, i32 1
store i64* %36, i64** %7
store i64 %34, i64* %35
br label %37
37: ; preds = %23
%38 = load i64, i64* %11
%39 = add nsw i64 %38, -1
store i64 %39, i64* %11
br label %20
40: ; preds = %20
br label %41
41: ; preds = %40
%42 = load i64, i64* %10
%43 = add nsw i64 %42, -1
store i64 %43, i64* %10
br label %16
44: ; preds = %16
%45 = load i64*, i64** %7
store i64 0, i64* %45
%46 = load i64*, i64** %4
ret i64* %46
}

LLVM IR (-O2):
define i64* @binary_str(i64* returned writeonly %0, i32 %1, i64 %2) {
%4 = icmp sgt i64 %2, 0
br i1 %4, label %5, label %69
5: ; preds = %3
%6 = zext i32 %1 to i64
%7 = and i64 %6, 128
%8 = icmp eq i64 %7, 0
%9 = select i1 %8, i64 48, i64 49
%10 = and i64 %6, 64
%11 = icmp eq i64 %10, 0
%12 = select i1 %11, i64 48, i64 49
%13 = and i64 %6, 32
%14 = icmp eq i64 %13, 0
%15 = select i1 %14, i64 48, i64 49
%16 = and i64 %6, 16
%17 = icmp eq i64 %16, 0
%18 = select i1 %17, i64 48, i64 49
%19 = and i64 %6, 8
%20 = icmp eq i64 %19, 0
%21 = select i1 %20, i64 48, i64 49
%22 = and i64 %6, 4
%23 = icmp eq i64 %22, 0
%24 = select i1 %23, i64 48, i64 49
%25 = and i64 %6, 2
%26 = icmp eq i64 %25, 0
%27 = select i1 %26, i64 48, i64 49
%28 = and i64 %6, 1
%29 = or i64 %28, 48
%30 = and i64 %2, 1
%31 = icmp eq i64 %30, 0
br i1 %31, label %42, label %32
32: ; preds = %5
%33 = getelementptr inbounds i64, i64* %0, i64 1
store i64 %9, i64* %0
%34 = getelementptr inbounds i64, i64* %0, i64 2
store i64 %12, i64* %33
%35 = getelementptr inbounds i64, i64* %0, i64 3
store i64 %15, i64* %34
%36 = getelementptr inbounds i64, i64* %0, i64 4
store i64 %18, i64* %35
%37 = getelementptr inbounds i64, i64* %0, i64 5
store i64 %21, i64* %36
%38 = getelementptr inbounds i64, i64* %0, i64 6
store i64 %24, i64* %37
%39 = getelementptr inbounds i64, i64* %0, i64 7
store i64 %27, i64* %38
%40 = getelementptr inbounds i64, i64* %0, i64 8
store i64 %29, i64* %39
%41 = add nsw i64 %2, -1
br label %42
42: ; preds = %32, %5
%43 = phi i64 [ %2, %5 ], [ %41, %32 ]
%44 = phi i64* [ %0, %5 ], [ %40, %32 ]
%45 = phi i64* [ undef, %5 ], [ %40, %32 ]
%46 = icmp eq i64 %2, 1
br i1 %46, label %69, label %47
47: ; preds = %42, %47
%48 = phi i64 [ %66, %47 ], [ %43, %42 ]
%49 = phi i64* [ %65, %47 ], [ %44, %42 ]
%50 = getelementptr inbounds i64, i64* %49, i64 1
store i64 %9, i64* %49
%51 = getelementptr inbounds i64, i64* %49, i64 2
store i64 %12, i64* %50
%52 = getelementptr inbounds i64, i64* %49, i64 3
store i64 %15, i64* %51
%53 = getelementptr inbounds i64, i64* %49, i64 4
store i64 %18, i64* %52
%54 = getelementptr inbounds i64, i64* %49, i64 5
store i64 %21, i64* %53
%55 = getelementptr inbounds i64, i64* %49, i64 6
store i64 %24, i64* %54
%56 = getelementptr inbounds i64, i64* %49, i64 7
store i64 %27, i64* %55
%57 = getelementptr inbounds i64, i64* %49, i64 8
store i64 %29, i64* %56
%58 = getelementptr inbounds i64, i64* %49, i64 9
store i64 %9, i64* %57
%59 = getelementptr inbounds i64, i64* %49, i64 10
store i64 %12, i64* %58
%60 = getelementptr inbounds i64, i64* %49, i64 11
store i64 %15, i64* %59
%61 = getelementptr inbounds i64, i64* %49, i64 12
store i64 %18, i64* %60
%62 = getelementptr inbounds i64, i64* %49, i64 13
store i64 %21, i64* %61
%63 = getelementptr inbounds i64, i64* %49, i64 14
store i64 %24, i64* %62
%64 = getelementptr inbounds i64, i64* %49, i64 15
store i64 %27, i64* %63
%65 = getelementptr inbounds i64, i64* %49, i64 16
store i64 %29, i64* %64
%66 = add nsw i64 %48, -2
%67 = add i64 %48, -3
%68 = icmp ult i64 %67, -2
br i1 %68, label %47, label %69
69: ; preds = %42, %47, %3
%70 = phi i64* [ %0, %3 ], [ %45, %42 ], [ %65, %47 ]
store i64 0, i64* %70
ret i64* %0
}