int test_sll(signed long long x) {
  return __builtin_llabs(x) + __builtin_clzll(x) + __builtin_ctzll(x) +
         __builtin_ffsll(x) + __builtin_parityll(x) + __builtin_popcountll(x);
}


x86 assembly (clang, -O0):
<test_sll>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rax
xor    %ecx,%ecx
sub    %rax,%rcx
cmp    $0x0,%rax
cmovl  %rcx,%rax
mov    -0x8(%rbp),%rcx
bsr    %rcx,%rcx
xor    $0x3f,%rcx
movslq %ecx,%rcx
add    %rcx,%rax
mov    -0x8(%rbp),%rcx
bsf    %rcx,%rcx
movslq %ecx,%rcx
add    %rcx,%rax
mov    -0x8(%rbp),%rsi
bsf    %rsi,%rcx
add    $0x1,%rcx
xor    %edx,%edx
cmp    $0x0,%rsi
cmove  %rdx,%rcx
movslq %ecx,%rcx
add    %rcx,%rax
mov    -0x8(%rbp),%rdx
mov    %rdx,%rcx
shr    %rcx
movabs $0x5555555555555555,%rsi
55 55 55
and    %rsi,%rcx
sub    %rcx,%rdx
movabs $0x3333333333333333,%rsi
33 33 33
mov    %rdx,%rcx
and    %rsi,%rcx
shr    $0x2,%rdx
and    %rsi,%rdx
add    %rdx,%rcx
mov    %rcx,%rdx
shr    $0x4,%rdx
add    %rdx,%rcx
movabs $0xf0f0f0f0f0f0f0f,%rdx
0f 0f 0f
and    %rdx,%rcx
movabs $0x101010101010101,%rdx
01 01 01
imul   %rdx,%rcx
shr    $0x38,%rcx
and    $0x1,%rcx
movslq %ecx,%rcx
add    %rcx,%rax
mov    -0x8(%rbp),%rdx
mov    %rdx,%rcx
shr    %rcx
movabs $0x5555555555555555,%rsi
55 55 55
and    %rsi,%rcx
sub    %rcx,%rdx
movabs $0x3333333333333333,%rsi
33 33 33
mov    %rdx,%rcx
and    %rsi,%rcx
shr    $0x2,%rdx
and    %rsi,%rdx
add    %rdx,%rcx
mov    %rcx,%rdx
shr    $0x4,%rdx
add    %rdx,%rcx
movabs $0xf0f0f0f0f0f0f0f,%rdx
0f 0f 0f
and    %rdx,%rcx
movabs $0x101010101010101,%rdx
01 01 01
imul   %rdx,%rcx
shr    $0x38,%rcx
movslq %ecx,%rcx
add    %rcx,%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<test_sll>:
mov    %rdi,%rax
neg    %rax
cmovs  %rdi,%rax
bsr    %rdi,%rcx
xor    $0x3f,%ecx
add    %ecx,%eax
bsf    %rdi,%rcx
add    %ecx,%eax
add    $0x1,%ecx
mov    %rdi,%rdx
shr    %rdx
movabs $0x5555555555555555,%rsi
55 55 55
and    %rdx,%rsi
mov    %rdi,%rdx
sub    %rsi,%rdx
movabs $0x3333333333333333,%r8
33 33 33
mov    %rdx,%rsi
and    %r8,%rsi
shr    $0x2,%rdx
and    %r8,%rdx
add    %rsi,%rdx
mov    %rdx,%rsi
shr    $0x4,%rsi
add    %rdx,%rsi
movabs $0xf0f0f0f0f0f0f0f,%rdx
0f 0f 0f
and    %rsi,%rdx
movabs $0x101010101010101,%rsi
01 01 01
imul   %rdx,%rsi
shr    $0x38,%rsi
add    %esi,%eax
and    $0x1,%esi
add    %eax,%esi
xor    %eax,%eax
test   %rdi,%rdi
cmovne %ecx,%eax
add    %esi,%eax
ret

LLVM IR (-O0):
define i32 @test_sll(i64 %0) {
%2 = alloca i64
store i64 %0, i64* %2
%3 = load i64, i64* %2
%4 = sub nsw i64 0, %3
%5 = icmp slt i64 %3, 0
%6 = select i1 %5, i64 %4, i64 %3
%7 = load i64, i64* %2
%8 = call i64 @llvm.ctlz.i64(i64 %7, i1 true)
%9 = trunc i64 %8 to i32
%10 = sext i32 %9 to i64
%11 = add nsw i64 %6, %10
%12 = load i64, i64* %2
%13 = call i64 @llvm.cttz.i64(i64 %12, i1 true)
%14 = trunc i64 %13 to i32
%15 = sext i32 %14 to i64
%16 = add nsw i64 %11, %15
%17 = load i64, i64* %2
%18 = call i64 @llvm.cttz.i64(i64 %17, i1 true)
%19 = add i64 %18, 1
%20 = icmp eq i64 %17, 0
%21 = select i1 %20, i64 0, i64 %19
%22 = trunc i64 %21 to i32
%23 = sext i32 %22 to i64
%24 = add nsw i64 %16, %23
%25 = load i64, i64* %2
%26 = call i64 @llvm.ctpop.i64(i64 %25)
%27 = and i64 %26, 1
%28 = trunc i64 %27 to i32
%29 = sext i32 %28 to i64
%30 = add nsw i64 %24, %29
%31 = load i64, i64* %2
%32 = call i64 @llvm.ctpop.i64(i64 %31)
%33 = trunc i64 %32 to i32
%34 = sext i32 %33 to i64
%35 = add nsw i64 %30, %34
%36 = trunc i64 %35 to i32
ret i32 %36
}

LLVM IR (-O2):
define i32 @test_sll(i64 %0) {
%2 = tail call i64 @llvm.abs.i64(i64 %0, i1 true)
%3 = tail call i64 @llvm.ctlz.i64(i64 %0, i1 true)
%4 = add nuw nsw i64 %2, %3
%5 = tail call i64 @llvm.cttz.i64(i64 %0, i1 true)
%6 = add nuw nsw i64 %4, %5
%7 = icmp eq i64 %0, 0
%8 = add nuw nsw i64 %5, 1
%9 = select i1 %7, i64 0, i64 %8
%10 = tail call i64 @llvm.ctpop.i64(i64 %0)
%11 = and i64 %10, 1
%12 = add nuw i64 %6, %10
%13 = add nuw i64 %12, %11
%14 = add nuw i64 %13, %9
%15 = trunc i64 %14 to i32
ret i32 %15
}