#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 uint16_t;

/* Variables and functions */
int pop16(uint16_t x) {
  return ((x & 1) != 0) + ((x & 2) != 0) + ((x & 4) != 0) + ((x & 8) != 0) +
         ((x & 16) != 0) + ((x & 32) != 0) + ((x & 64) != 0) +
         ((x & 128) != 0) + ((x & 256) != 0) + ((x & 512) != 0) +
         ((x & 1024) != 0) + ((x & 2048) != 0) + ((x & 4096) != 0) +
         ((x & 8192) != 0) + ((x & 16384) != 0) + ((x & 32768) != 0);
}


x86 assembly (clang, -O0):
<pop16>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    -0x4(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
setne  %al
and    $0x1,%al
movzbl %al,%eax
mov    -0x4(%rbp),%ecx
and    $0x2,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x4(%rbp),%ecx
and    $0x4,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x4(%rbp),%ecx
and    $0x8,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x4(%rbp),%ecx
and    $0x10,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x4(%rbp),%ecx
and    $0x20,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x4(%rbp),%ecx
and    $0x40,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x4(%rbp),%ecx
and    $0x80,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x4(%rbp),%ecx
and    $0x100,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x4(%rbp),%ecx
and    $0x200,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x4(%rbp),%ecx
and    $0x400,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x4(%rbp),%ecx
and    $0x800,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x4(%rbp),%ecx
and    $0x1000,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x4(%rbp),%ecx
and    $0x2000,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x4(%rbp),%ecx
and    $0x4000,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
mov    -0x4(%rbp),%ecx
and    $0x8000,%ecx
cmp    $0x0,%ecx
setne  %cl
and    $0x1,%cl
movzbl %cl,%ecx
add    %ecx,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<pop16>:
mov    %edi,%eax
and    $0x1,%eax
mov    %edi,%ecx
shr    %ecx
and    $0x1,%ecx
add    %eax,%ecx
mov    %edi,%eax
shr    $0x2,%eax
and    $0x1,%eax
add    %ecx,%eax
mov    %edi,%ecx
shr    $0x3,%ecx
and    $0x1,%ecx
add    %eax,%ecx
mov    %edi,%eax
shr    $0x4,%eax
and    $0x1,%eax
add    %ecx,%eax
mov    %edi,%ecx
shr    $0x5,%ecx
and    $0x1,%ecx
add    %eax,%ecx
mov    %edi,%eax
shr    $0x6,%eax
and    $0x1,%eax
add    %ecx,%eax
mov    %edi,%ecx
shr    $0x7,%ecx
and    $0x1,%ecx
add    %eax,%ecx
mov    %edi,%eax
shr    $0x8,%eax
and    $0x1,%eax
add    %ecx,%eax
mov    %edi,%ecx
shr    $0x9,%ecx
and    $0x1,%ecx
add    %eax,%ecx
mov    %edi,%eax
shr    $0xa,%eax
and    $0x1,%eax
add    %ecx,%eax
mov    %edi,%ecx
shr    $0xb,%ecx
and    $0x1,%ecx
add    %eax,%ecx
mov    %edi,%eax
shr    $0xc,%eax
and    $0x1,%eax
add    %ecx,%eax
mov    %edi,%ecx
shr    $0xd,%ecx
and    $0x1,%ecx
add    %eax,%ecx
mov    %edi,%eax
shr    $0xe,%eax
and    $0x1,%eax
add    %ecx,%eax
shr    $0xf,%edi
and    $0x1,%edi
add    %edi,%eax
ret

LLVM IR (-O0):
define i32 @pop16(i32 %0) {
%2 = alloca i32
store i32 %0, i32* %2
%3 = load i32, i32* %2
%4 = and i32 %3, 1
%5 = icmp ne i32 %4, 0
%6 = zext i1 %5 to i32
%7 = load i32, i32* %2
%8 = and i32 %7, 2
%9 = icmp ne i32 %8, 0
%10 = zext i1 %9 to i32
%11 = add nsw i32 %6, %10
%12 = load i32, i32* %2
%13 = and i32 %12, 4
%14 = icmp ne i32 %13, 0
%15 = zext i1 %14 to i32
%16 = add nsw i32 %11, %15
%17 = load i32, i32* %2
%18 = and i32 %17, 8
%19 = icmp ne i32 %18, 0
%20 = zext i1 %19 to i32
%21 = add nsw i32 %16, %20
%22 = load i32, i32* %2
%23 = and i32 %22, 16
%24 = icmp ne i32 %23, 0
%25 = zext i1 %24 to i32
%26 = add nsw i32 %21, %25
%27 = load i32, i32* %2
%28 = and i32 %27, 32
%29 = icmp ne i32 %28, 0
%30 = zext i1 %29 to i32
%31 = add nsw i32 %26, %30
%32 = load i32, i32* %2
%33 = and i32 %32, 64
%34 = icmp ne i32 %33, 0
%35 = zext i1 %34 to i32
%36 = add nsw i32 %31, %35
%37 = load i32, i32* %2
%38 = and i32 %37, 128
%39 = icmp ne i32 %38, 0
%40 = zext i1 %39 to i32
%41 = add nsw i32 %36, %40
%42 = load i32, i32* %2
%43 = and i32 %42, 256
%44 = icmp ne i32 %43, 0
%45 = zext i1 %44 to i32
%46 = add nsw i32 %41, %45
%47 = load i32, i32* %2
%48 = and i32 %47, 512
%49 = icmp ne i32 %48, 0
%50 = zext i1 %49 to i32
%51 = add nsw i32 %46, %50
%52 = load i32, i32* %2
%53 = and i32 %52, 1024
%54 = icmp ne i32 %53, 0
%55 = zext i1 %54 to i32
%56 = add nsw i32 %51, %55
%57 = load i32, i32* %2
%58 = and i32 %57, 2048
%59 = icmp ne i32 %58, 0
%60 = zext i1 %59 to i32
%61 = add nsw i32 %56, %60
%62 = load i32, i32* %2
%63 = and i32 %62, 4096
%64 = icmp ne i32 %63, 0
%65 = zext i1 %64 to i32
%66 = add nsw i32 %61, %65
%67 = load i32, i32* %2
%68 = and i32 %67, 8192
%69 = icmp ne i32 %68, 0
%70 = zext i1 %69 to i32
%71 = add nsw i32 %66, %70
%72 = load i32, i32* %2
%73 = and i32 %72, 16384
%74 = icmp ne i32 %73, 0
%75 = zext i1 %74 to i32
%76 = add nsw i32 %71, %75
%77 = load i32, i32* %2
%78 = and i32 %77, 32768
%79 = icmp ne i32 %78, 0
%80 = zext i1 %79 to i32
%81 = add nsw i32 %76, %80
ret i32 %81
}

LLVM IR (-O2):
define i32 @pop16(i32 %0) {
%2 = and i32 %0, 1
%3 = lshr i32 %0, 1
%4 = and i32 %3, 1
%5 = add nuw nsw i32 %4, %2
%6 = lshr i32 %0, 2
%7 = and i32 %6, 1
%8 = add nuw nsw i32 %5, %7
%9 = lshr i32 %0, 3
%10 = and i32 %9, 1
%11 = add nuw nsw i32 %8, %10
%12 = lshr i32 %0, 4
%13 = and i32 %12, 1
%14 = add nuw nsw i32 %11, %13
%15 = lshr i32 %0, 5
%16 = and i32 %15, 1
%17 = add nuw nsw i32 %14, %16
%18 = lshr i32 %0, 6
%19 = and i32 %18, 1
%20 = add nuw nsw i32 %17, %19
%21 = lshr i32 %0, 7
%22 = and i32 %21, 1
%23 = add nuw nsw i32 %20, %22
%24 = lshr i32 %0, 8
%25 = and i32 %24, 1
%26 = add nuw nsw i32 %23, %25
%27 = lshr i32 %0, 9
%28 = and i32 %27, 1
%29 = add nuw nsw i32 %26, %28
%30 = lshr i32 %0, 10
%31 = and i32 %30, 1
%32 = add nuw nsw i32 %29, %31
%33 = lshr i32 %0, 11
%34 = and i32 %33, 1
%35 = add nuw nsw i32 %32, %34
%36 = lshr i32 %0, 12
%37 = and i32 %36, 1
%38 = add nuw nsw i32 %35, %37
%39 = lshr i32 %0, 13
%40 = and i32 %39, 1
%41 = add nuw nsw i32 %38, %40
%42 = lshr i32 %0, 14
%43 = and i32 %42, 1
%44 = add nuw nsw i32 %41, %43
%45 = lshr i32 %0, 15
%46 = and i32 %45, 1
%47 = add nuw nsw i32 %44, %46
ret i32 %47
}