int detrand(int x, int y) {
  unsigned int z;
  static const unsigned char t[256] = {
      0, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1,
      0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0,
      0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1,
      1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1,
      0, 0, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0,
      0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 0,
      0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 1, 1, 0, 1, 0,
      0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1,
      1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0,
      0, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1,
      1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0,
  };
  z = ((0x04b3e375 * x) ^ y) * 0x05a8ef93;
  z = t[z & 0xff] ^ t[(z >> 8) & 0xff] ^ t[(z >> 16) & 0xff] ^
      t[(z >> 24) & 0xff];
  return z & 1;
}


x86 assembly (clang, -O0):
<detrand>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
imul   $0x4b3e375,-0x4(%rbp),%eax
xor    -0x8(%rbp),%eax
imul   $0x5a8ef93,%eax,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
and    $0xff,%eax
mov    %eax,%eax
mov    %eax,%ecx
lea    0xed0(%rip),%rax
movzbl (%rax,%rcx,1),%eax
mov    -0xc(%rbp),%ecx
shr    $0x8,%ecx
and    $0xff,%ecx
mov    %ecx,%ecx
mov    %ecx,%edx
lea    0xeb5(%rip),%rcx
movzbl (%rcx,%rdx,1),%ecx
xor    %ecx,%eax
mov    -0xc(%rbp),%ecx
shr    $0x10,%ecx
and    $0xff,%ecx
mov    %ecx,%ecx
mov    %ecx,%edx
lea    0xe98(%rip),%rcx
movzbl (%rcx,%rdx,1),%ecx
xor    %ecx,%eax
mov    -0xc(%rbp),%ecx
shr    $0x18,%ecx
and    $0xff,%ecx
mov    %ecx,%ecx
mov    %ecx,%edx
lea    0xe7b(%rip),%rcx
movzbl (%rcx,%rdx,1),%ecx
xor    %ecx,%eax
mov    %eax,-0xc(%rbp)
mov    -0xc(%rbp),%eax
and    $0x1,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<detrand>:
imul   $0x4b3e375,%edi,%eax
xor    %esi,%eax
imul   $0x5a8ef93,%eax,%eax
movzbl %al,%ecx
lea    0xee8(%rip),%rdi
mov    %eax,%esi
shr    $0x8,%esi
movzbl %sil,%esi
mov    (%rsi,%rdi,1),%dl
xor    (%rcx,%rdi,1),%dl
mov    %eax,%ecx
shr    $0x10,%ecx
movzbl %cl,%ecx
xor    (%rcx,%rdi,1),%dl
shr    $0x18,%rax
xor    (%rax,%rdi,1),%dl
and    $0x1,%dl
movzbl %dl,%eax
ret

LLVM IR (-O0):
@detrand.t = internal constant [256 x i8] c"\00\01\01\00\01\00\01\01\00\01\01\00\00\01\01\01\00\00\00\01\01\01\00\01\00\01\01\00\01\00\00\00\00\00\00\01\01\01\00\01\01\00\00\01\00\00\00\00\00\01\00\00\01\01\00\00\00\01\00\01\01\01\01\01\01\00\01\01\01\01\01\01\01\00\01\01\00\01\01\01\01\00\01\00\00\00\01\01\00\00\00\00\01\00\01\01\00\00\01\01\01\00\00\01\00\01\01\01\01\01\01\01\01\01\01\01\00\01\00\00\00\00\00\00\01\00\01\00\01\00\01\00\00\01\00\00\01\00\01\01\01\00\01\00\00\00\00\01\00\00\00\00\00\00\01\00\01\00\01\00\01\00\00\01\01\00\01\00\00\00\00\00\00\01\00\00\00\00\01\01\01\01\00\01\01\00\00\01\01\00\00\01\01\00\01\01\00\00\00\01\01\01\01\00\01\00\00\00\00\01\00\01\01\01\00\00\00\01\00\01\01\00\00\01\01\01\00\01\00\00\01\01\00\00\01\01\01\00\00\01\01\01\00\00\00\00\01\00\01\00\01\00\01\00\01\00"
define i32 @detrand(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
store i32 %0, i32* %3
store i32 %1, i32* %4
%6 = load i32, i32* %3
%7 = mul nsw i32 78898037, %6
%8 = load i32, i32* %4
%9 = xor i32 %7, %8
%10 = mul nsw i32 %9, 94957459
store i32 %10, i32* %5
%11 = load i32, i32* %5
%12 = and i32 %11, 255
%13 = zext i32 %12 to i64
%14 = getelementptr inbounds [256 x i8], [256 x i8]* @detrand.t, i64 0, i64 %13
%15 = load i8, i8* %14
%16 = zext i8 %15 to i32
%17 = load i32, i32* %5
%18 = lshr i32 %17, 8
%19 = and i32 %18, 255
%20 = zext i32 %19 to i64
%21 = getelementptr inbounds [256 x i8], [256 x i8]* @detrand.t, i64 0, i64 %20
%22 = load i8, i8* %21
%23 = zext i8 %22 to i32
%24 = xor i32 %16, %23
%25 = load i32, i32* %5
%26 = lshr i32 %25, 16
%27 = and i32 %26, 255
%28 = zext i32 %27 to i64
%29 = getelementptr inbounds [256 x i8], [256 x i8]* @detrand.t, i64 0, i64 %28
%30 = load i8, i8* %29
%31 = zext i8 %30 to i32
%32 = xor i32 %24, %31
%33 = load i32, i32* %5
%34 = lshr i32 %33, 24
%35 = and i32 %34, 255
%36 = zext i32 %35 to i64
%37 = getelementptr inbounds [256 x i8], [256 x i8]* @detrand.t, i64 0, i64 %36
%38 = load i8, i8* %37
%39 = zext i8 %38 to i32
%40 = xor i32 %32, %39
store i32 %40, i32* %5
%41 = load i32, i32* %5
%42 = and i32 %41, 1
ret i32 %42
}

LLVM IR (-O2):
@detrand.t = internal unnamed_addr constant [256 x i8] c"\00\01\01\00\01\00\01\01\00\01\01\00\00\01\01\01\00\00\00\01\01\01\00\01\00\01\01\00\01\00\00\00\00\00\00\01\01\01\00\01\01\00\00\01\00\00\00\00\00\01\00\00\01\01\00\00\00\01\00\01\01\01\01\01\01\00\01\01\01\01\01\01\01\00\01\01\00\01\01\01\01\00\01\00\00\00\01\01\00\00\00\00\01\00\01\01\00\00\01\01\01\00\00\01\00\01\01\01\01\01\01\01\01\01\01\01\00\01\00\00\00\00\00\00\01\00\01\00\01\00\01\00\00\01\00\00\01\00\01\01\01\00\01\00\00\00\00\01\00\00\00\00\00\00\01\00\01\00\01\00\01\00\00\01\01\00\01\00\00\00\00\00\00\01\00\00\00\00\01\01\01\01\00\01\01\00\00\01\01\00\00\01\01\00\01\01\00\00\00\01\01\01\01\00\01\00\00\00\00\01\00\01\01\01\00\00\00\01\00\01\01\00\00\01\01\01\00\01\00\00\01\01\00\00\01\01\01\00\00\01\01\01\00\00\00\00\01\00\01\00\01\00\01\00\01\00"
define i32 @detrand(i32 %0, i32 %1) {
%3 = mul nsw i32 %0, 78898037
%4 = xor i32 %3, %1
%5 = mul nsw i32 %4, 94957459
%6 = and i32 %5, 255
%7 = zext i32 %6 to i64
%8 = getelementptr inbounds [256 x i8], [256 x i8]* @detrand.t, i64 0, i64 %7
%9 = load i8, i8* %8
%10 = lshr i32 %5, 8
%11 = and i32 %10, 255
%12 = zext i32 %11 to i64
%13 = getelementptr inbounds [256 x i8], [256 x i8]* @detrand.t, i64 0, i64 %12
%14 = load i8, i8* %13
%15 = xor i8 %14, %9
%16 = lshr i32 %5, 16
%17 = and i32 %16, 255
%18 = zext i32 %17 to i64
%19 = getelementptr inbounds [256 x i8], [256 x i8]* @detrand.t, i64 0, i64 %18
%20 = load i8, i8* %19
%21 = xor i8 %15, %20
%22 = lshr i32 %5, 24
%23 = zext i32 %22 to i64
%24 = getelementptr inbounds [256 x i8], [256 x i8]* @detrand.t, i64 0, i64 %23
%25 = load i8, i8* %24
%26 = xor i8 %21, %25
%27 = and i8 %26, 1
%28 = zext i8 %27 to i32
ret i32 %28
}