void int2bin_evenpad(long decimal, char *binary) {
  int k = 0, n = 0;
  int neg_flag = 0;
  int remain;
  char temp[80];
  if (decimal < 0) {
    decimal = -decimal;
    neg_flag = 1;
  }
  do {
    remain = decimal % 2;
    decimal = decimal / 2;
    temp[k++] = remain + '0';
  } while (decimal > 0);
  while (k % 2 != 0) {
    temp[k++] = '0';
  }
  if (neg_flag)
    temp[k++] = '-';
  while (k >= 0)
    binary[n++] = temp[--k];
  binary[n - 1] = 0;
}


x86 assembly (clang, -O0):
<int2bin_evenpad>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpq   $0x0,-0x8(%rbp)
jge    113d <int2bin_evenpad+0x3d>
xor    %eax,%eax
sub    -0x8(%rbp),%rax
mov    %rax,-0x8(%rbp)
movl   $0x1,-0x1c(%rbp)
jmp    1142 <int2bin_evenpad+0x42>
mov    -0x8(%rbp),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
mov    %edx,%eax
mov    %eax,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    $0x2,%ecx
cqto
idiv   %rcx
mov    %rax,-0x8(%rbp)
mov    -0x20(%rbp),%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x14(%rbp),%eax
mov    %eax,%edx
add    $0x1,%edx
mov    %edx,-0x14(%rbp)
cltq
mov    %cl,-0x70(%rbp,%rax,1)
cmpq   $0x0,-0x8(%rbp)
jg     1142 <int2bin_evenpad+0x42>
jmp    1190 <int2bin_evenpad+0x90>
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
je     11bb <int2bin_evenpad+0xbb>
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x14(%rbp)
cltq
movb   $0x30,-0x70(%rbp,%rax,1)
jmp    1190 <int2bin_evenpad+0x90>
cmpl   $0x0,-0x1c(%rbp)
je     11d7 <int2bin_evenpad+0xd7>
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0x1,%ecx
mov    %ecx,-0x14(%rbp)
cltq
movb   $0x2d,-0x70(%rbp,%rax,1)
jmp    11dc <int2bin_evenpad+0xdc>
cmpl   $0x0,-0x14(%rbp)
jl     120f <int2bin_evenpad+0x10f>
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
cltq
mov    -0x70(%rbp,%rax,1),%dl
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x18(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    11dc <int2bin_evenpad+0xdc>
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
pop    %rbp
ret

x86 assembly (clang, -O2):
<int2bin_evenpad>:
mov    %rdi,%r8
neg    %r8
cmovs  %rdi,%r8
xor    %r11d,%r11d
mov    %r8,%rdx
shr    $0x3f,%rdx
add    %r8,%rdx
mov    %edx,%eax
and    $0xfe,%eax
mov    %r8d,%ecx
sub    %eax,%ecx
sar    %rdx
add    $0x30,%cl
mov    %cl,-0x58(%rsp,%r11,1)
add    $0x1,%r11
cmp    $0x1,%r8
mov    %rdx,%r8
jg     1110 <int2bin_evenpad+0x10>
test   $0x1,%r11b
jne    1162 <int2bin_evenpad+0x62>
test   %rdi,%rdi
js     1173 <int2bin_evenpad+0x73>
test   %r11d,%r11d
js     1184 <int2bin_evenpad+0x84>
mov    %r11d,%r8d
lea    0x1(%r11),%r9d
cmp    $0x7,%r11d
jae    118f <int2bin_evenpad+0x8f>
xor    %edx,%edx
mov    %r8,%r10
jmp    12a2 <int2bin_evenpad+0x1a2>
mov    %r11d,%eax
movb   $0x30,-0x58(%rsp,%rax,1)
add    $0x1,%r11d
test   %rdi,%rdi
jns    1146 <int2bin_evenpad+0x46>
mov    %r11d,%eax
add    $0x1,%r11d
movb   $0x2d,-0x58(%rsp,%rax,1)
test   %r11d,%r11d
jns    114b <int2bin_evenpad+0x4b>
mov    $0xffffffff,%r11d
jmp    12c3 <int2bin_evenpad+0x1c3>
cmp    $0x1f,%r11d
jae    119c <int2bin_evenpad+0x9c>
xor    %edx,%edx
jmp    1250 <int2bin_evenpad+0x150>
mov    %r9d,%edx
and    $0xffffffe0,%edx
lea    -0x58(%rsp),%rax
lea    (%r8,%rax,1),%rdi
add    $0xfffffffffffffff0,%rdi
xor    %ecx,%ecx
pxor   %xmm0,%xmm0
cs nopw 0x0(%rax,%rax,1)
nop
movdqu -0x10(%rdi),%xmm1
movdqu (%rdi),%xmm2
movdqa %xmm2,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
packuswb %xmm3,%xmm2
movdqa %xmm1,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm3,%xmm1
movdqu %xmm2,(%rsi,%rcx,1)
movdqu %xmm1,0x10(%rsi,%rcx,1)
add    $0x20,%rcx
add    $0xffffffffffffffe0,%rdi
cmp    %rcx,%rdx
jne    11c0 <int2bin_evenpad+0xc0>
cmp    %r9,%rdx
je     12c3 <int2bin_evenpad+0x1c3>
test   $0x18,%r9b
je     12cb <int2bin_evenpad+0x1cb>
mov    %rdx,%rdi
mov    %r9d,%edx
and    $0xfffffff8,%edx
mov    %r8,%r10
sub    %rdx,%r10
sub    %rdi,%r8
lea    (%rsp,%r8,1),%rcx
add    $0xffffffffffffffa0,%rcx
pxor   %xmm0,%xmm0
xchg   %ax,%ax
movq   (%rcx),%xmm1
punpcklbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm1,%xmm1
movq   %xmm1,(%rsi,%rdi,1)
add    $0x8,%rdi
add    $0xfffffffffffffff8,%rcx
cmp    %rdi,%rdx
jne    1270 <int2bin_evenpad+0x170>
cmp    %r9,%rdx
je     12c3 <int2bin_evenpad+0x1c3>
lea    -0x58(%rsp),%rax
lea    (%r10,%rax,1),%rcx
add    $0xffffffffffffffff,%rcx
nop
movzbl (%rcx),%eax
mov    %al,(%rsi,%rdx,1)
add    $0x1,%rdx
add    $0xffffffffffffffff,%rcx
cmp    %rdx,%r9
jne    12b0 <int2bin_evenpad+0x1b0>
movslq %r11d,%rax
movb   $0x0,(%rsi,%rax,1)
ret
sub    %rdx,%r8
jmp    115a <int2bin_evenpad+0x5a>

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

LLVM IR (-O2):
define void @int2bin_evenpad(i64 %0, i8* nocapture writeonly %1) {
%3 = alloca [80 x i8]
%4 = getelementptr inbounds [80 x i8], [80 x i8]* %3, i64 0, i64 0
%5 = icmp slt i64 %0, 0
%6 = sub nsw i64 0, %0
%7 = select i1 %5, i64 %6, i64 %0
br label %8
8: ; preds = %8, %2
%9 = phi i64 [ %15, %8 ], [ 0, %2 ]
%10 = phi i64 [ %13, %8 ], [ %7, %2 ]
%11 = srem i64 %10, 2
%12 = trunc i64 %11 to i8
%13 = sdiv i64 %10, 2
%14 = add nsw i8 %12, 48
%15 = add nuw i64 %9, 1
%16 = getelementptr inbounds [80 x i8], [80 x i8]* %3, i64 0, i64 %9
store i8 %14, i8* %16
%17 = icmp sgt i64 %10, 1
br i1 %17, label %8, label %18
18: ; preds = %8
%19 = trunc i64 %15 to i32
%20 = and i32 %19, 1
%21 = icmp eq i32 %20, 0
br i1 %21, label %27, label %22
22: ; preds = %18
%23 = and i64 %15, 4294967295
%24 = getelementptr inbounds [80 x i8], [80 x i8]* %3, i64 0, i64 %23
store i8 48, i8* %24
%25 = trunc i64 %9 to i32
%26 = add i32 %25, 2
br label %27
27: ; preds = %22, %18
%28 = phi i32 [ %19, %18 ], [ %26, %22 ]
br i1 %5, label %29, label %33
29: ; preds = %27
%30 = add nuw nsw i32 %28, 1
%31 = zext i32 %28 to i64
%32 = getelementptr inbounds [80 x i8], [80 x i8]* %3, i64 0, i64 %31
store i8 45, i8* %32
br label %33
33: ; preds = %29, %27
%34 = phi i32 [ %30, %29 ], [ %28, %27 ]
%35 = icmp sgt i32 %34, -1
br i1 %35, label %36, label %101
36: ; preds = %33
%37 = zext i32 %34 to i64
%38 = add nuw i32 %34, 1
%39 = zext i32 %38 to i64
%40 = icmp ult i32 %34, 7
br i1 %40, label %89, label %41
41: ; preds = %36
%42 = icmp ult i32 %34, 31
br i1 %42, label %70, label %43
43: ; preds = %41
%44 = and i64 %39, 4294967264
br label %45
45: ; preds = %45, %43
%46 = phi i64 [ 0, %43 ], [ %62, %45 ]
%47 = xor i64 %46, -1
%48 = add i64 %47, %37
%49 = getelementptr inbounds [80 x i8], [80 x i8]* %3, i64 0, i64 %48
%50 = getelementptr inbounds i8, i8* %49, i64 -15
%51 = bitcast i8* %50 to <16 x i8>*
%52 = load <16 x i8>, <16 x i8>* %51
%53 = shufflevector <16 x i8> %52, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%54 = getelementptr inbounds i8, i8* %49, i64 -31
%55 = bitcast i8* %54 to <16 x i8>*
%56 = load <16 x i8>, <16 x i8>* %55
%57 = shufflevector <16 x i8> %56, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%58 = getelementptr inbounds i8, i8* %1, i64 %46
%59 = bitcast i8* %58 to <16 x i8>*
store <16 x i8> %53, <16 x i8>* %59
%60 = getelementptr inbounds i8, i8* %58, i64 16
%61 = bitcast i8* %60 to <16 x i8>*
store <16 x i8> %57, <16 x i8>* %61
%62 = add nuw i64 %46, 32
%63 = icmp eq i64 %62, %44
br i1 %63, label %64, label %45
64: ; preds = %45
%65 = icmp eq i64 %44, %39
br i1 %65, label %101, label %66
66: ; preds = %64
%67 = sub nsw i64 %37, %44
%68 = and i64 %39, 24
%69 = icmp eq i64 %68, 0
br i1 %69, label %89, label %70
70: ; preds = %41, %66
%71 = phi i64 [ %44, %66 ], [ 0, %41 ]
%72 = and i64 %39, 4294967288
%73 = sub nsw i64 %37, %72
br label %74
74: ; preds = %74, %70
%75 = phi i64 [ %71, %70 ], [ %85, %74 ]
%76 = xor i64 %75, -1
%77 = add i64 %76, %37
%78 = getelementptr inbounds [80 x i8], [80 x i8]* %3, i64 0, i64 %77
%79 = getelementptr inbounds i8, i8* %78, i64 -7
%80 = bitcast i8* %79 to <8 x i8>*
%81 = load <8 x i8>, <8 x i8>* %80
%82 = shufflevector <8 x i8> %81, <8 x i8> poison, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%83 = getelementptr inbounds i8, i8* %1, i64 %75
%84 = bitcast i8* %83 to <8 x i8>*
store <8 x i8> %82, <8 x i8>* %84
%85 = add nuw i64 %75, 8
%86 = icmp eq i64 %85, %72
br i1 %86, label %87, label %74
87: ; preds = %74
%88 = icmp eq i64 %72, %39
br i1 %88, label %101, label %89
89: ; preds = %36, %66, %87
%90 = phi i64 [ %37, %36 ], [ %67, %66 ], [ %73, %87 ]
%91 = phi i64 [ 0, %36 ], [ %44, %66 ], [ %72, %87 ]
br label %92
92: ; preds = %89, %92
%93 = phi i64 [ %95, %92 ], [ %90, %89 ]
%94 = phi i64 [ %98, %92 ], [ %91, %89 ]
%95 = add nsw i64 %93, -1
%96 = getelementptr inbounds [80 x i8], [80 x i8]* %3, i64 0, i64 %95
%97 = load i8, i8* %96
%98 = add nuw nsw i64 %94, 1
%99 = getelementptr inbounds i8, i8* %1, i64 %94
store i8 %97, i8* %99
%100 = icmp eq i64 %98, %39
br i1 %100, label %101, label %92
101: ; preds = %92, %64, %87, %33
%102 = phi i32 [ -1, %33 ], [ %34, %87 ], [ %34, %64 ], [ %34, %92 ]
%103 = sext i32 %102 to i64
%104 = getelementptr inbounds i8, i8* %1, i64 %103
store i8 0, i8* %104
ret void
}