unsigned char mod_getdata(const unsigned int datacells) {
  unsigned char data;
  data = ((datacells & 0x4000) >> 7);
  data |= ((datacells & 0x1000) >> 6);
  data |= ((datacells & 0x0400) >> 5);
  data |= ((datacells & 0x0100) >> 4);
  data |= ((datacells & 0x0040) >> 3);
  data |= ((datacells & 0x0010) >> 2);
  data |= ((datacells & 0x0004) >> 1);
  data |= ((datacells & 0x0001) >> 0);
  return data;
}


x86 assembly (clang, -O0):
<mod_getdata>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    -0x4(%rbp),%eax
and    $0x4000,%eax
shr    $0x7,%eax
mov    %al,-0x5(%rbp)
mov    -0x4(%rbp),%ecx
and    $0x1000,%ecx
shr    $0x6,%ecx
movzbl -0x5(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x5(%rbp)
mov    -0x4(%rbp),%ecx
and    $0x400,%ecx
shr    $0x5,%ecx
movzbl -0x5(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x5(%rbp)
mov    -0x4(%rbp),%ecx
and    $0x100,%ecx
shr    $0x4,%ecx
movzbl -0x5(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x5(%rbp)
mov    -0x4(%rbp),%ecx
and    $0x40,%ecx
shr    $0x3,%ecx
movzbl -0x5(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x5(%rbp)
mov    -0x4(%rbp),%ecx
and    $0x10,%ecx
shr    $0x2,%ecx
movzbl -0x5(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x5(%rbp)
mov    -0x4(%rbp),%ecx
and    $0x4,%ecx
shr    $0x1,%ecx
movzbl -0x5(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x5(%rbp)
mov    -0x4(%rbp),%ecx
and    $0x1,%ecx
shr    $0x0,%ecx
movzbl -0x5(%rbp),%eax
or     %ecx,%eax
mov    %al,-0x5(%rbp)
movzbl -0x5(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<mod_getdata>:
mov    %edi,%r8d
shr    $0x7,%r8d
and    $0x80,%r8d
mov    %edi,%eax
shr    $0x6,%eax
and    $0x40,%eax
mov    %edi,%r9d
shr    $0x5,%r9d
and    $0x20,%r9d
mov    %edi,%r10d
shr    $0x4,%r10d
and    $0x10,%r10d
mov    %edi,%ecx
shr    $0x3,%ecx
and    $0x8,%ecx
mov    %edi,%edx
shr    $0x2,%edx
and    $0x4,%edx
mov    %edi,%esi
shr    %esi
and    $0x2,%esi
and    $0x1,%edi
or     %edi,%eax
or     %r8d,%eax
or     %r9d,%eax
or     %r10d,%eax
or     %ecx,%eax
or     %edx,%eax
or     %esi,%eax
ret

LLVM IR (-O0):
define zeroext i8 @mod_getdata(i32 %0) {
%2 = alloca i32
%3 = alloca i8
store i32 %0, i32* %2
%4 = load i32, i32* %2
%5 = and i32 %4, 16384
%6 = lshr i32 %5, 7
%7 = trunc i32 %6 to i8
store i8 %7, i8* %3
%8 = load i32, i32* %2
%9 = and i32 %8, 4096
%10 = lshr i32 %9, 6
%11 = load i8, i8* %3
%12 = zext i8 %11 to i32
%13 = or i32 %12, %10
%14 = trunc i32 %13 to i8
store i8 %14, i8* %3
%15 = load i32, i32* %2
%16 = and i32 %15, 1024
%17 = lshr i32 %16, 5
%18 = load i8, i8* %3
%19 = zext i8 %18 to i32
%20 = or i32 %19, %17
%21 = trunc i32 %20 to i8
store i8 %21, i8* %3
%22 = load i32, i32* %2
%23 = and i32 %22, 256
%24 = lshr i32 %23, 4
%25 = load i8, i8* %3
%26 = zext i8 %25 to i32
%27 = or i32 %26, %24
%28 = trunc i32 %27 to i8
store i8 %28, i8* %3
%29 = load i32, i32* %2
%30 = and i32 %29, 64
%31 = lshr i32 %30, 3
%32 = load i8, i8* %3
%33 = zext i8 %32 to i32
%34 = or i32 %33, %31
%35 = trunc i32 %34 to i8
store i8 %35, i8* %3
%36 = load i32, i32* %2
%37 = and i32 %36, 16
%38 = lshr i32 %37, 2
%39 = load i8, i8* %3
%40 = zext i8 %39 to i32
%41 = or i32 %40, %38
%42 = trunc i32 %41 to i8
store i8 %42, i8* %3
%43 = load i32, i32* %2
%44 = and i32 %43, 4
%45 = lshr i32 %44, 1
%46 = load i8, i8* %3
%47 = zext i8 %46 to i32
%48 = or i32 %47, %45
%49 = trunc i32 %48 to i8
store i8 %49, i8* %3
%50 = load i32, i32* %2
%51 = and i32 %50, 1
%52 = lshr i32 %51, 0
%53 = load i8, i8* %3
%54 = zext i8 %53 to i32
%55 = or i32 %54, %52
%56 = trunc i32 %55 to i8
store i8 %56, i8* %3
%57 = load i8, i8* %3
ret i8 %57
}

LLVM IR (-O2):
define zeroext i8 @mod_getdata(i32 %0) {
%2 = lshr i32 %0, 7
%3 = and i32 %2, 128
%4 = lshr i32 %0, 6
%5 = and i32 %4, 64
%6 = lshr i32 %0, 5
%7 = and i32 %6, 32
%8 = lshr i32 %0, 4
%9 = and i32 %8, 16
%10 = lshr i32 %0, 3
%11 = and i32 %10, 8
%12 = lshr i32 %0, 2
%13 = and i32 %12, 4
%14 = lshr i32 %0, 1
%15 = and i32 %14, 2
%16 = and i32 %0, 1
%17 = or i32 %5, %16
%18 = or i32 %17, %3
%19 = or i32 %18, %7
%20 = or i32 %19, %9
%21 = or i32 %20, %11
%22 = or i32 %21, %13
%23 = or i32 %22, %15
%24 = trunc i32 %23 to i8
ret i8 %24
}