unsigned long MaskCombineReadEvent(int efnum) {
  unsigned long tmp, tmp1, tmp2;
  if (efnum > 3) {
    printf("bad efnum\n");
    return 0;
  }
  tmp1 = ({
    unsigned long __v =
        (*(volatile unsigned long *)(((0x01800000 + 0xa0) + (efnum * 4))));
    __v;
  });
  tmp2 = ({
    unsigned long __v =
        (*(volatile unsigned long *)(((0x01800000 + 0x80) + (efnum * 4))));
    __v;
  });
  tmp = 0;
  tmp |= tmp1;
  tmp &= ~(tmp2);
  return tmp;
}


x86 assembly (clang, -O0):
<MaskCombineReadEvent>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %edi,-0xc(%rbp)
cmpl   $0x3,-0xc(%rbp)
jle    1140 <MaskCombineReadEvent+0x30>
lea    0xed4(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
movq   $0x0,-0x8(%rbp)
jmp    11b4 <MaskCombineReadEvent+0xa4>
mov    -0xc(%rbp),%eax
shl    $0x2,%eax
add    $0x18000a0,%eax
cltq
mov    (%rax),%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0xc(%rbp),%eax
shl    $0x2,%eax
add    $0x1800080,%eax
cltq
mov    (%rax),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,-0x28(%rbp)
movq   $0x0,-0x18(%rbp)
mov    -0x20(%rbp),%rax
or     -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x28(%rbp),%rax
xor    $0xffffffffffffffff,%rax
and    -0x18(%rbp),%rax
mov    %rax,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<MaskCombineReadEvent>:
push   %rax
cmp    $0x4,%edi
jl     1126 <MaskCombineReadEvent+0x16>
lea    0xee3(%rip),%rdi
call   1030 <puts@plt>
xor    %eax,%eax
pop    %rcx
ret
movslq %edi,%rax
mov    0x18000a0(,%rax,4),%rcx
01
mov    0x1800080(,%rax,4),%rax
01
not    %rax
and    %rcx,%rax
pop    %rcx
ret

LLVM IR (-O0):
@.str = [11 x i8] c"bad efnum\0A\00"
define i64 @MaskCombineReadEvent(i32 %0) {
%2 = alloca i64
%3 = alloca i32
%4 = alloca i64
%5 = alloca i64
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
store i32 %0, i32* %3
%11 = load i32, i32* %3
%12 = icmp sgt i32 %11, 3
br i1 %12, label %13, label %15
13: ; preds = %1
%14 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i64 0, i64 0))
store i64 0, i64* %2
br label %40
15: ; preds = %1
%16 = load i32, i32* %3
%17 = mul nsw i32 %16, 4
%18 = add nsw i32 25165984, %17
%19 = sext i32 %18 to i64
%20 = inttoptr i64 %19 to i64*
%21 = load volatile i64, i64* %20
store i64 %21, i64* %7
%22 = load i64, i64* %7
store i64 %22, i64* %8
%23 = load i64, i64* %8
store i64 %23, i64* %5
%24 = load i32, i32* %3
%25 = mul nsw i32 %24, 4
%26 = add nsw i32 25165952, %25
%27 = sext i32 %26 to i64
%28 = inttoptr i64 %27 to i64*
%29 = load volatile i64, i64* %28
store i64 %29, i64* %9
%30 = load i64, i64* %9
store i64 %30, i64* %10
%31 = load i64, i64* %10
store i64 %31, i64* %6
store i64 0, i64* %4
%32 = load i64, i64* %5
%33 = load i64, i64* %4
%34 = or i64 %33, %32
store i64 %34, i64* %4
%35 = load i64, i64* %6
%36 = xor i64 %35, -1
%37 = load i64, i64* %4
%38 = and i64 %37, %36
store i64 %38, i64* %4
%39 = load i64, i64* %4
store i64 %39, i64* %2
br label %40
40: ; preds = %15, %13
%41 = load i64, i64* %2
ret i64 %41
}

LLVM IR (-O2):
@str = [10 x i8] c"bad efnum\00"
define i64 @MaskCombineReadEvent(i32 %0) {
%2 = icmp sgt i32 %0, 3
br i1 %2, label %3, label %5
3: ; preds = %1
%4 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @str, i64 0, i64 0))
br label %17
5: ; preds = %1
%6 = shl nsw i32 %0, 2
%7 = add nsw i32 %6, 25165984
%8 = sext i32 %7 to i64
%9 = inttoptr i64 %8 to i64*
%10 = load volatile i64, i64* %9
%11 = add nsw i32 %6, 25165952
%12 = sext i32 %11 to i64
%13 = inttoptr i64 %12 to i64*
%14 = load volatile i64, i64* %13
%15 = xor i64 %14, -1
%16 = and i64 %10, %15
br label %17
17: ; preds = %5, %3
%18 = phi i64 [ 0, %3 ], [ %16, %5 ]
ret i64 %18
}