unsigned char bits_to_byte(char bt0, char bt1, char bt2, char bt3, char bt4,
                           char bt5, char bt6, char bt7) {
  unsigned char rbyte;
  if (bt0 > 0)
    bt0 = 1;
  else
    bt0 = 0;
  if (bt1 > 0)
    bt1 = 1;
  else
    bt1 = 0;
  if (bt2 > 0)
    bt2 = 1;
  else
    bt2 = 0;
  if (bt3 > 0)
    bt3 = 1;
  else
    bt3 = 0;
  if (bt4 > 0)
    bt4 = 1;
  else
    bt4 = 0;
  if (bt5 > 0)
    bt5 = 1;
  else
    bt5 = 0;
  if (bt6 > 0)
    bt6 = 1;
  else
    bt6 = 0;
  if (bt7 > 0)
    bt7 = 1;
  else
    bt7 = 0;
  rbyte = (unsigned char)(bt0 + (2 * bt1) + (4 * bt2) + (8 * bt3) + (16 * bt4) +
                          (32 * bt5) + (64 * bt6) + (128 * bt7));
  return (rbyte);
}


x86 assembly (clang, -O0):
<bits_to_byte>:
push   %rbp
mov    %rsp,%rbp
mov    %r8d,-0x18(%rbp)
mov    %ecx,%eax
mov    -0x18(%rbp),%ecx
mov    %eax,-0x14(%rbp)
mov    %edx,%eax
mov    -0x14(%rbp),%edx
mov    %eax,-0x10(%rbp)
mov    %esi,%eax
mov    -0x10(%rbp),%esi
mov    %eax,-0xc(%rbp)
mov    %edi,%r8d
mov    -0xc(%rbp),%edi
mov    %r9b,%al
mov    0x18(%rbp),%r9b
mov    0x10(%rbp),%r9b
mov    %r8b,-0x1(%rbp)
mov    %dil,-0x2(%rbp)
mov    %sil,-0x3(%rbp)
mov    %dl,-0x4(%rbp)
mov    %cl,-0x5(%rbp)
mov    %al,-0x6(%rbp)
movsbl -0x1(%rbp),%eax
cmp    $0x0,%eax
jle    115c <bits_to_byte+0x5c>
movb   $0x1,-0x1(%rbp)
jmp    1160 <bits_to_byte+0x60>
movb   $0x0,-0x1(%rbp)
movsbl -0x2(%rbp),%eax
cmp    $0x0,%eax
jle    1176 <bits_to_byte+0x76>
movb   $0x1,-0x2(%rbp)
jmp    117a <bits_to_byte+0x7a>
movb   $0x0,-0x2(%rbp)
movsbl -0x3(%rbp),%eax
cmp    $0x0,%eax
jle    1190 <bits_to_byte+0x90>
movb   $0x1,-0x3(%rbp)
jmp    1194 <bits_to_byte+0x94>
movb   $0x0,-0x3(%rbp)
movsbl -0x4(%rbp),%eax
cmp    $0x0,%eax
jle    11aa <bits_to_byte+0xaa>
movb   $0x1,-0x4(%rbp)
jmp    11ae <bits_to_byte+0xae>
movb   $0x0,-0x4(%rbp)
movsbl -0x5(%rbp),%eax
cmp    $0x0,%eax
jle    11c4 <bits_to_byte+0xc4>
movb   $0x1,-0x5(%rbp)
jmp    11c8 <bits_to_byte+0xc8>
movb   $0x0,-0x5(%rbp)
movsbl -0x6(%rbp),%eax
cmp    $0x0,%eax
jle    11de <bits_to_byte+0xde>
movb   $0x1,-0x6(%rbp)
jmp    11e2 <bits_to_byte+0xe2>
movb   $0x0,-0x6(%rbp)
movsbl 0x10(%rbp),%eax
cmp    $0x0,%eax
jle    11f8 <bits_to_byte+0xf8>
movb   $0x1,0x10(%rbp)
jmp    11fc <bits_to_byte+0xfc>
movb   $0x0,0x10(%rbp)
movsbl 0x18(%rbp),%eax
cmp    $0x0,%eax
jle    1212 <bits_to_byte+0x112>
movb   $0x1,0x18(%rbp)
jmp    1216 <bits_to_byte+0x116>
movb   $0x0,0x18(%rbp)
movsbl -0x1(%rbp),%eax
movsbl -0x2(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
movsbl -0x3(%rbp),%ecx
shl    $0x2,%ecx
add    %ecx,%eax
movsbl -0x4(%rbp),%ecx
shl    $0x3,%ecx
add    %ecx,%eax
movsbl -0x5(%rbp),%ecx
shl    $0x4,%ecx
add    %ecx,%eax
movsbl -0x6(%rbp),%ecx
shl    $0x5,%ecx
add    %ecx,%eax
movsbl 0x10(%rbp),%ecx
shl    $0x6,%ecx
add    %ecx,%eax
movsbl 0x18(%rbp),%ecx
shl    $0x7,%ecx
add    %ecx,%eax
mov    %al,-0x7(%rbp)
movzbl -0x7(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<bits_to_byte>:
test   %dil,%dil
setg   %dil
test   %sil,%sil
setg   %al
add    %al,%al
test   %dl,%dl
setg   %sil
shl    $0x2,%sil
test   %cl,%cl
setg   %r10b
shl    $0x3,%r10b
test   %r8b,%r8b
setg   %r8b
shl    $0x4,%r8b
test   %r9b,%r9b
setg   %r9b
shl    $0x5,%r9b
cmpb   $0x0,0x8(%rsp)
setg   %dl
shl    $0x6,%dl
cmpb   $0x0,0x10(%rsp)
setg   %cl
shl    $0x7,%cl
or     %dil,%al
or     %sil,%al
or     %r10b,%al
or     %r8b,%al
or     %r9b,%al
or     %dl,%al
add    %cl,%al
ret

LLVM IR (-O0):
define zeroext i8 @bits_to_byte(i8 signext %0, i8 signext %1, i8 signext %2, i8 signext %3, i8 signext %4, i8 signext %5, i8 signext %6, i8 signext %7) {
%9 = alloca i8
%10 = alloca i8
%11 = alloca i8
%12 = alloca i8
%13 = alloca i8
%14 = alloca i8
%15 = alloca i8
%16 = alloca i8
%17 = alloca i8
store i8 %0, i8* %9
store i8 %1, i8* %10
store i8 %2, i8* %11
store i8 %3, i8* %12
store i8 %4, i8* %13
store i8 %5, i8* %14
store i8 %6, i8* %15
store i8 %7, i8* %16
%18 = load i8, i8* %9
%19 = sext i8 %18 to i32
%20 = icmp sgt i32 %19, 0
br i1 %20, label %21, label %22
21: ; preds = %8
store i8 1, i8* %9
br label %23
22: ; preds = %8
store i8 0, i8* %9
br label %23
23: ; preds = %22, %21
%24 = load i8, i8* %10
%25 = sext i8 %24 to i32
%26 = icmp sgt i32 %25, 0
br i1 %26, label %27, label %28
27: ; preds = %23
store i8 1, i8* %10
br label %29
28: ; preds = %23
store i8 0, i8* %10
br label %29
29: ; preds = %28, %27
%30 = load i8, i8* %11
%31 = sext i8 %30 to i32
%32 = icmp sgt i32 %31, 0
br i1 %32, label %33, label %34
33: ; preds = %29
store i8 1, i8* %11
br label %35
34: ; preds = %29
store i8 0, i8* %11
br label %35
35: ; preds = %34, %33
%36 = load i8, i8* %12
%37 = sext i8 %36 to i32
%38 = icmp sgt i32 %37, 0
br i1 %38, label %39, label %40
39: ; preds = %35
store i8 1, i8* %12
br label %41
40: ; preds = %35
store i8 0, i8* %12
br label %41
41: ; preds = %40, %39
%42 = load i8, i8* %13
%43 = sext i8 %42 to i32
%44 = icmp sgt i32 %43, 0
br i1 %44, label %45, label %46
45: ; preds = %41
store i8 1, i8* %13
br label %47
46: ; preds = %41
store i8 0, i8* %13
br label %47
47: ; preds = %46, %45
%48 = load i8, i8* %14
%49 = sext i8 %48 to i32
%50 = icmp sgt i32 %49, 0
br i1 %50, label %51, label %52
51: ; preds = %47
store i8 1, i8* %14
br label %53
52: ; preds = %47
store i8 0, i8* %14
br label %53
53: ; preds = %52, %51
%54 = load i8, i8* %15
%55 = sext i8 %54 to i32
%56 = icmp sgt i32 %55, 0
br i1 %56, label %57, label %58
57: ; preds = %53
store i8 1, i8* %15
br label %59
58: ; preds = %53
store i8 0, i8* %15
br label %59
59: ; preds = %58, %57
%60 = load i8, i8* %16
%61 = sext i8 %60 to i32
%62 = icmp sgt i32 %61, 0
br i1 %62, label %63, label %64
63: ; preds = %59
store i8 1, i8* %16
br label %65
64: ; preds = %59
store i8 0, i8* %16
br label %65
65: ; preds = %64, %63
%66 = load i8, i8* %9
%67 = sext i8 %66 to i32
%68 = load i8, i8* %10
%69 = sext i8 %68 to i32
%70 = mul nsw i32 2, %69
%71 = add nsw i32 %67, %70
%72 = load i8, i8* %11
%73 = sext i8 %72 to i32
%74 = mul nsw i32 4, %73
%75 = add nsw i32 %71, %74
%76 = load i8, i8* %12
%77 = sext i8 %76 to i32
%78 = mul nsw i32 8, %77
%79 = add nsw i32 %75, %78
%80 = load i8, i8* %13
%81 = sext i8 %80 to i32
%82 = mul nsw i32 16, %81
%83 = add nsw i32 %79, %82
%84 = load i8, i8* %14
%85 = sext i8 %84 to i32
%86 = mul nsw i32 32, %85
%87 = add nsw i32 %83, %86
%88 = load i8, i8* %15
%89 = sext i8 %88 to i32
%90 = mul nsw i32 64, %89
%91 = add nsw i32 %87, %90
%92 = load i8, i8* %16
%93 = sext i8 %92 to i32
%94 = mul nsw i32 128, %93
%95 = add nsw i32 %91, %94
%96 = trunc i32 %95 to i8
store i8 %96, i8* %17
%97 = load i8, i8* %17
ret i8 %97
}

LLVM IR (-O2):
define zeroext i8 @bits_to_byte(i8 signext %0, i8 signext %1, i8 signext %2, i8 signext %3, i8 signext %4, i8 signext %5, i8 signext %6, i8 signext %7) {
%9 = icmp sgt i8 %0, 0
%10 = zext i1 %9 to i8
%11 = icmp sgt i8 %1, 0
%12 = select i1 %11, i8 2, i8 0
%13 = icmp sgt i8 %2, 0
%14 = select i1 %13, i8 4, i8 0
%15 = icmp sgt i8 %3, 0
%16 = select i1 %15, i8 8, i8 0
%17 = icmp sgt i8 %4, 0
%18 = select i1 %17, i8 16, i8 0
%19 = icmp sgt i8 %5, 0
%20 = select i1 %19, i8 32, i8 0
%21 = icmp sgt i8 %6, 0
%22 = select i1 %21, i8 64, i8 0
%23 = icmp sgt i8 %7, 0
%24 = select i1 %23, i8 -128, i8 0
%25 = or i8 %12, %10
%26 = or i8 %25, %14
%27 = or i8 %26, %16
%28 = or i8 %27, %18
%29 = or i8 %28, %20
%30 = or i8 %29, %22
%31 = add i8 %30, %24
ret i8 %31
}