unsigned int functionF(int rightSidePlaintext, int key) {
  int a[4][16] = {{14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7},
                  {0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8},
                  {4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0},
                  {15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13}};
  int part0 = rightSidePlaintext & 0x1;
  int part1 = (rightSidePlaintext & 0x2) >> 1;
  int part2 = (rightSidePlaintext & 0x4) >> 2;
  int part3 = (rightSidePlaintext & 0x8) >> 3;
  unsigned int combined = (part3 << 5) | (part0 << 4) | (part1 << 3) |
                          (part2 << 2) | (part3 << 1) | part1;
  combined = combined ^ key;
  int combinedPart0 = combined & 0x1;
  int combinedPart1 = (combined & 0x2) >> 1;
  int combinedPart2 = (combined & 0x4) >> 2;
  int combinedPart3 = (combined & 0x8) >> 3;
  int combinedPart4 = (combined & 0x16) >> 4;
  int combinedPart5 = (combined & 0x32) >> 5;
  unsigned int column = (combinedPart4 << 3) | (combinedPart3 << 2) |
                        (combinedPart2 << 1) | combinedPart1;
  unsigned int row = (combinedPart0 << 1) | combinedPart5;
  unsigned int output = a[row][column];
  int outputPart0 = output & 0x1;
  int outputPart1 = (output & 0x2) >> 1;
  int outputPart2 = (output & 0x4) >> 2;
  int outputPart3 = (output & 0x8) >> 3;
  int final = (outputPart2 << 3) | (outputPart1 << 2) | (outputPart0 << 1) |
              outputPart3;
  return final;
}


x86 assembly (clang, -O0):
<functionF>:
push   %rbp
mov    %rsp,%rbp
sub    $0x160,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
lea    -0x110(%rbp),%rdi
lea    0xed1(%rip),%rsi
mov    $0x100,%edx
call   1030 <memcpy@plt>
mov    -0x4(%rbp),%eax
and    $0x1,%eax
mov    %eax,-0x114(%rbp)
mov    -0x4(%rbp),%eax
and    $0x2,%eax
sar    $0x1,%eax
mov    %eax,-0x118(%rbp)
mov    -0x4(%rbp),%eax
and    $0x4,%eax
sar    $0x2,%eax
mov    %eax,-0x11c(%rbp)
mov    -0x4(%rbp),%eax
and    $0x8,%eax
sar    $0x3,%eax
mov    %eax,-0x120(%rbp)
mov    -0x120(%rbp),%eax
shl    $0x5,%eax
mov    -0x114(%rbp),%ecx
shl    $0x4,%ecx
or     %ecx,%eax
mov    -0x118(%rbp),%ecx
shl    $0x3,%ecx
or     %ecx,%eax
mov    -0x11c(%rbp),%ecx
shl    $0x2,%ecx
or     %ecx,%eax
mov    -0x120(%rbp),%ecx
shl    $0x1,%ecx
or     %ecx,%eax
or     -0x118(%rbp),%eax
mov    %eax,-0x124(%rbp)
mov    -0x124(%rbp),%eax
xor    -0x8(%rbp),%eax
mov    %eax,-0x124(%rbp)
mov    -0x124(%rbp),%eax
and    $0x1,%eax
mov    %eax,-0x128(%rbp)
mov    -0x124(%rbp),%eax
and    $0x2,%eax
shr    $0x1,%eax
mov    %eax,-0x12c(%rbp)
mov    -0x124(%rbp),%eax
and    $0x4,%eax
shr    $0x2,%eax
mov    %eax,-0x130(%rbp)
mov    -0x124(%rbp),%eax
and    $0x8,%eax
shr    $0x3,%eax
mov    %eax,-0x134(%rbp)
mov    -0x124(%rbp),%eax
and    $0x16,%eax
shr    $0x4,%eax
mov    %eax,-0x138(%rbp)
mov    -0x124(%rbp),%eax
and    $0x32,%eax
shr    $0x5,%eax
mov    %eax,-0x13c(%rbp)
mov    -0x138(%rbp),%eax
shl    $0x3,%eax
mov    -0x134(%rbp),%ecx
shl    $0x2,%ecx
or     %ecx,%eax
mov    -0x130(%rbp),%ecx
shl    $0x1,%ecx
or     %ecx,%eax
or     -0x12c(%rbp),%eax
mov    %eax,-0x140(%rbp)
mov    -0x128(%rbp),%eax
shl    $0x1,%eax
or     -0x13c(%rbp),%eax
mov    %eax,-0x144(%rbp)
mov    -0x144(%rbp),%eax
mov    %eax,%ecx
lea    -0x110(%rbp),%rax
shl    $0x6,%rcx
add    %rcx,%rax
mov    -0x140(%rbp),%ecx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x148(%rbp)
mov    -0x148(%rbp),%eax
and    $0x1,%eax
mov    %eax,-0x14c(%rbp)
mov    -0x148(%rbp),%eax
and    $0x2,%eax
shr    $0x1,%eax
mov    %eax,-0x150(%rbp)
mov    -0x148(%rbp),%eax
and    $0x4,%eax
shr    $0x2,%eax
mov    %eax,-0x154(%rbp)
mov    -0x148(%rbp),%eax
and    $0x8,%eax
shr    $0x3,%eax
mov    %eax,-0x158(%rbp)
mov    -0x154(%rbp),%eax
shl    $0x3,%eax
mov    -0x150(%rbp),%ecx
shl    $0x2,%ecx
or     %ecx,%eax
mov    -0x14c(%rbp),%ecx
shl    $0x1,%ecx
or     %ecx,%eax
or     -0x158(%rbp),%eax
mov    %eax,-0x15c(%rbp)
mov    -0x15c(%rbp),%eax
add    $0x160,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<functionF>:
mov    %edi,%eax
shr    %eax
and    $0x1,%eax
mov    %edi,%r8d
and    $0x4,%r8d
mov    %edi,%edx
shr    $0x3,%edx
and    $0x1,%edx
mov    %edx,%ecx
shl    $0x5,%ecx
shl    $0x4,%edi
and    $0x10,%edi
or     %ecx,%edi
lea    (%rdi,%rax,8),%ecx
or     %r8d,%ecx
lea    (%rcx,%rdx,2),%ecx
or     %eax,%ecx
xor    %esi,%ecx
mov    %ecx,%eax
shr    %eax
mov    %ecx,%edx
shr    $0x5,%edx
and    $0x1,%edx
and    $0xf,%eax
and    $0x1,%ecx
lea    (%rdx,%rcx,2),%ecx
shl    $0x6,%rcx
lea    0xeb0(%rip),%rdx
add    %rcx,%rdx
mov    (%rdx,%rax,4),%eax
mov    %eax,%ecx
shr    $0x3,%ecx
and    $0x1,%ecx
and    $0x7,%eax
lea    (%rcx,%rax,2),%eax
ret

LLVM IR (-O0):
@__const.functionF.a = [4 x [16 x i32]] [[16 x i32] [i32 14, i32 4, i32 13, i32 1, i32 2, i32 15, i32 11, i32 8, i32 3, i32 10, i32 6, i32 12, i32 5, i32 9, i32 0, i32 7], [16 x i32] [i32 0, i32 15, i32 7, i32 4, i32 14, i32 2, i32 13, i32 1, i32 10, i32 6, i32 12, i32 11, i32 9, i32 5, i32 3, i32 8], [16 x i32] [i32 4, i32 1, i32 14, i32 8, i32 13, i32 6, i32 2, i32 11, i32 15, i32 12, i32 9, i32 7, i32 3, i32 10, i32 5, i32 0], [16 x i32] [i32 15, i32 12, i32 8, i32 2, i32 4, i32 9, i32 1, i32 7, i32 5, i32 11, i32 3, i32 14, i32 10, i32 0, i32 6, i32 13]]
define i32 @functionF(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca [4 x [16 x i32]]
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca i32
store i32 %0, i32* %3
store i32 %1, i32* %4
%25 = bitcast [4 x [16 x i32]]* %5 to i8*
%26 = load i32, i32* %3
%27 = and i32 %26, 1
store i32 %27, i32* %6
%28 = load i32, i32* %3
%29 = and i32 %28, 2
%30 = ashr i32 %29, 1
store i32 %30, i32* %7
%31 = load i32, i32* %3
%32 = and i32 %31, 4
%33 = ashr i32 %32, 2
store i32 %33, i32* %8
%34 = load i32, i32* %3
%35 = and i32 %34, 8
%36 = ashr i32 %35, 3
store i32 %36, i32* %9
%37 = load i32, i32* %9
%38 = shl i32 %37, 5
%39 = load i32, i32* %6
%40 = shl i32 %39, 4
%41 = or i32 %38, %40
%42 = load i32, i32* %7
%43 = shl i32 %42, 3
%44 = or i32 %41, %43
%45 = load i32, i32* %8
%46 = shl i32 %45, 2
%47 = or i32 %44, %46
%48 = load i32, i32* %9
%49 = shl i32 %48, 1
%50 = or i32 %47, %49
%51 = load i32, i32* %7
%52 = or i32 %50, %51
store i32 %52, i32* %10
%53 = load i32, i32* %10
%54 = load i32, i32* %4
%55 = xor i32 %53, %54
store i32 %55, i32* %10
%56 = load i32, i32* %10
%57 = and i32 %56, 1
store i32 %57, i32* %11
%58 = load i32, i32* %10
%59 = and i32 %58, 2
%60 = lshr i32 %59, 1
store i32 %60, i32* %12
%61 = load i32, i32* %10
%62 = and i32 %61, 4
%63 = lshr i32 %62, 2
store i32 %63, i32* %13
%64 = load i32, i32* %10
%65 = and i32 %64, 8
%66 = lshr i32 %65, 3
store i32 %66, i32* %14
%67 = load i32, i32* %10
%68 = and i32 %67, 22
%69 = lshr i32 %68, 4
store i32 %69, i32* %15
%70 = load i32, i32* %10
%71 = and i32 %70, 50
%72 = lshr i32 %71, 5
store i32 %72, i32* %16
%73 = load i32, i32* %15
%74 = shl i32 %73, 3
%75 = load i32, i32* %14
%76 = shl i32 %75, 2
%77 = or i32 %74, %76
%78 = load i32, i32* %13
%79 = shl i32 %78, 1
%80 = or i32 %77, %79
%81 = load i32, i32* %12
%82 = or i32 %80, %81
store i32 %82, i32* %17
%83 = load i32, i32* %11
%84 = shl i32 %83, 1
%85 = load i32, i32* %16
%86 = or i32 %84, %85
store i32 %86, i32* %18
%87 = load i32, i32* %18
%88 = zext i32 %87 to i64
%89 = getelementptr inbounds [4 x [16 x i32]], [4 x [16 x i32]]* %5, i64 0, i64 %88
%90 = load i32, i32* %17
%91 = zext i32 %90 to i64
%92 = getelementptr inbounds [16 x i32], [16 x i32]* %89, i64 0, i64 %91
%93 = load i32, i32* %92
store i32 %93, i32* %19
%94 = load i32, i32* %19
%95 = and i32 %94, 1
store i32 %95, i32* %20
%96 = load i32, i32* %19
%97 = and i32 %96, 2
%98 = lshr i32 %97, 1
store i32 %98, i32* %21
%99 = load i32, i32* %19
%100 = and i32 %99, 4
%101 = lshr i32 %100, 2
store i32 %101, i32* %22
%102 = load i32, i32* %19
%103 = and i32 %102, 8
%104 = lshr i32 %103, 3
store i32 %104, i32* %23
%105 = load i32, i32* %22
%106 = shl i32 %105, 3
%107 = load i32, i32* %21
%108 = shl i32 %107, 2
%109 = or i32 %106, %108
%110 = load i32, i32* %20
%111 = shl i32 %110, 1
%112 = or i32 %109, %111
%113 = load i32, i32* %23
%114 = or i32 %112, %113
store i32 %114, i32* %24
%115 = load i32, i32* %24
ret i32 %115
}

LLVM IR (-O2):
@__const.functionF.a = [4 x [16 x i32]] [[16 x i32] [i32 14, i32 4, i32 13, i32 1, i32 2, i32 15, i32 11, i32 8, i32 3, i32 10, i32 6, i32 12, i32 5, i32 9, i32 0, i32 7], [16 x i32] [i32 0, i32 15, i32 7, i32 4, i32 14, i32 2, i32 13, i32 1, i32 10, i32 6, i32 12, i32 11, i32 9, i32 5, i32 3, i32 8], [16 x i32] [i32 4, i32 1, i32 14, i32 8, i32 13, i32 6, i32 2, i32 11, i32 15, i32 12, i32 9, i32 7, i32 3, i32 10, i32 5, i32 0], [16 x i32] [i32 15, i32 12, i32 8, i32 2, i32 4, i32 9, i32 1, i32 7, i32 5, i32 11, i32 3, i32 14, i32 10, i32 0, i32 6, i32 13]]
define i32 @functionF(i32 %0, i32 %1) {
%3 = lshr i32 %0, 1
%4 = and i32 %3, 1
%5 = and i32 %0, 4
%6 = lshr i32 %0, 3
%7 = and i32 %6, 1
%8 = shl nuw nsw i32 %7, 5
%9 = shl i32 %0, 4
%10 = and i32 %9, 16
%11 = or i32 %8, %10
%12 = shl nuw nsw i32 %4, 3
%13 = or i32 %11, %12
%14 = or i32 %13, %5
%15 = shl nuw nsw i32 %7, 1
%16 = or i32 %14, %15
%17 = or i32 %16, %4
%18 = xor i32 %17, %1
%19 = lshr i32 %18, 1
%20 = lshr i32 %18, 5
%21 = and i32 %20, 1
%22 = and i32 %19, 15
%23 = shl i32 %18, 1
%24 = and i32 %23, 2
%25 = or i32 %24, %21
%26 = zext i32 %25 to i64
%27 = zext i32 %22 to i64
%28 = getelementptr inbounds [4 x [16 x i32]], [4 x [16 x i32]]* @__const.functionF.a, i64 0, i64 %26, i64 %27
%29 = load i32, i32* %28
%30 = lshr i32 %29, 3
%31 = and i32 %30, 1
%32 = shl i32 %29, 1
%33 = and i32 %32, 14
%34 = or i32 %33, %31
ret i32 %34
}