void xIntEnable(unsigned long ulInterrupt) {
  ;
  if (ulInterrupt == 4) {
    (*((volatile unsigned long *)(0xE000ED24))) |= 0x00010000;
  } else if (ulInterrupt == 5) {
    (*((volatile unsigned long *)(0xE000ED24))) |= 0x00020000;
  } else if (ulInterrupt == 6) {
    (*((volatile unsigned long *)(0xE000ED24))) |= 0x00040000;
  } else if (ulInterrupt == 15) {
    (*((volatile unsigned long *)(0xE000E010))) |= 0x00000002;
  } else if (((ulInterrupt & 0xFF) >= 16) && ((ulInterrupt & 0xFF) < 84)) {
    (*((volatile unsigned long *)(0xE000E100 +
                                  (((ulInterrupt & 0xFF) - 16) / 32) * 4))) =
        1 << (((ulInterrupt & 0xFF) - 16) % 32);
  } else if ((((ulInterrupt >> 8) & 0xFF) >= 16) &&
             (((ulInterrupt >> 8) & 0xFF) <= 84)) {
    (*((volatile unsigned long *)(0xE000E100 +
                                  ((((ulInterrupt >> 8) & 0xFF) - 16) / 32) *
                                      4))) =
        1 << ((((ulInterrupt >> 8) & 0xFF) - 16) % 32);
  } else if (ulInterrupt == 0x08290000) {
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (40 - 16);
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (41 - 16);
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (42 - 16);
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (43 - 16);
  } else if (ulInterrupt == 0x11030000) {
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (22 - 16);
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (23 - 16);
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (24 - 16);
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (25 - 16);
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (26 - 16);
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (39 - 16);
    (*((volatile unsigned long *)(0xE000E104))) = 1 << (56 - 48);
  } else if (ulInterrupt == 0x09110000) {
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (27 - 16);
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (28 - 16);
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (29 - 16);
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (30 - 16);
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (31 - 16);
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (32 - 16);
    (*((volatile unsigned long *)(0xE000E100))) = 1 << (33 - 16);
  } else if (ulInterrupt == 0x10210000) {
    (*((volatile unsigned long *)(0xE000E104))) = 1 << (72 - 48);
    (*((volatile unsigned long *)(0xE000E104))) = 1 << (73 - 48);
    (*((volatile unsigned long *)(0xE000E104))) = 1 << (74 - 48);
    (*((volatile unsigned long *)(0xE000E104))) = 1 << (75 - 48);
    (*((volatile unsigned long *)(0xE000E104))) = 1 << (76 - 48);
  }
}


x86 assembly (clang, -O0):
<xIntEnable>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
cmpq   $0x4,-0x8(%rbp)
jne    112f <xIntEnable+0x2f>
mov    $0xe000ed24,%eax
mov    (%rax),%rcx
or     $0x10000,%rcx
mov    $0xe000ed24,%eax
mov    %rcx,(%rax)
jmp    141b <xIntEnable+0x31b>
cmpq   $0x5,-0x8(%rbp)
jne    1156 <xIntEnable+0x56>
mov    $0xe000ed24,%eax
mov    (%rax),%rcx
or     $0x20000,%rcx
mov    $0xe000ed24,%eax
mov    %rcx,(%rax)
jmp    1416 <xIntEnable+0x316>
cmpq   $0x6,-0x8(%rbp)
jne    117d <xIntEnable+0x7d>
mov    $0xe000ed24,%eax
mov    (%rax),%rcx
or     $0x40000,%rcx
mov    $0xe000ed24,%eax
mov    %rcx,(%rax)
jmp    1411 <xIntEnable+0x311>
cmpq   $0xf,-0x8(%rbp)
jne    11a1 <xIntEnable+0xa1>
mov    $0xe000e010,%eax
mov    (%rax),%rcx
or     $0x2,%rcx
mov    $0xe000e010,%eax
mov    %rcx,(%rax)
jmp    140c <xIntEnable+0x30c>
mov    -0x8(%rbp),%rax
and    $0xff,%rax
cmp    $0x10,%rax
jb     1212 <xIntEnable+0x112>
mov    -0x8(%rbp),%rax
and    $0xff,%rax
cmp    $0x54,%rax
jae    1212 <xIntEnable+0x112>
mov    -0x8(%rbp),%rax
and    $0xff,%rax
sub    $0x10,%rax
and    $0x1f,%rax
mov    %eax,%ecx
mov    $0x1,%eax
shl    %cl,%eax
movslq %eax,%rcx
mov    -0x8(%rbp),%rax
and    $0xff,%rax
sub    $0x10,%rax
shr    $0x5,%rax
shl    $0x2,%rax
movabs $0xe000e100,%rdx
add    %rdx,%rax
mov    %rcx,(%rax)
jmp    1407 <xIntEnable+0x307>
mov    -0x8(%rbp),%rax
shr    $0x8,%rax
and    $0xff,%rax
cmp    $0x10,%rax
jb     1293 <xIntEnable+0x193>
mov    -0x8(%rbp),%rax
shr    $0x8,%rax
and    $0xff,%rax
cmp    $0x54,%rax
ja     1293 <xIntEnable+0x193>
mov    -0x8(%rbp),%rax
shr    $0x8,%rax
and    $0xff,%rax
sub    $0x10,%rax
and    $0x1f,%rax
mov    %eax,%ecx
mov    $0x1,%eax
shl    %cl,%eax
movslq %eax,%rcx
mov    -0x8(%rbp),%rax
shr    $0x8,%rax
and    $0xff,%rax
sub    $0x10,%rax
shr    $0x5,%rax
shl    $0x2,%rax
movabs $0xe000e100,%rdx
add    %rdx,%rax
mov    %rcx,(%rax)
jmp    1402 <xIntEnable+0x302>
cmpq   $0x8290000,-0x8(%rbp)
08
jne    12d6 <xIntEnable+0x1d6>
mov    $0xe000e100,%eax
movq   $0x1000000,(%rax)
mov    $0xe000e100,%eax
movq   $0x2000000,(%rax)
mov    $0xe000e100,%eax
movq   $0x4000000,(%rax)
mov    $0xe000e100,%eax
movq   $0x8000000,(%rax)
jmp    13fd <xIntEnable+0x2fd>
cmpq   $0x11030000,-0x8(%rbp)
11
jne    133d <xIntEnable+0x23d>
mov    $0xe000e100,%eax
movq   $0x40,(%rax)
mov    $0xe000e100,%eax
movq   $0x80,(%rax)
mov    $0xe000e100,%eax
movq   $0x100,(%rax)
mov    $0xe000e100,%eax
movq   $0x200,(%rax)
mov    $0xe000e100,%eax
movq   $0x400,(%rax)
mov    $0xe000e100,%eax
movq   $0x800000,(%rax)
mov    $0xe000e104,%eax
movq   $0x100,(%rax)
jmp    13f8 <xIntEnable+0x2f8>
cmpq   $0x9110000,-0x8(%rbp)
09
jne    13a4 <xIntEnable+0x2a4>
mov    $0xe000e100,%eax
movq   $0x800,(%rax)
mov    $0xe000e100,%eax
movq   $0x1000,(%rax)
mov    $0xe000e100,%eax
movq   $0x2000,(%rax)
mov    $0xe000e100,%eax
movq   $0x4000,(%rax)
mov    $0xe000e100,%eax
movq   $0x8000,(%rax)
mov    $0xe000e100,%eax
movq   $0x10000,(%rax)
mov    $0xe000e100,%eax
movq   $0x20000,(%rax)
jmp    13f3 <xIntEnable+0x2f3>
cmpq   $0x10210000,-0x8(%rbp)
10
jne    13ee <xIntEnable+0x2ee>
mov    $0xe000e104,%eax
movq   $0x1000000,(%rax)
mov    $0xe000e104,%eax
movq   $0x2000000,(%rax)
mov    $0xe000e104,%eax
movq   $0x4000000,(%rax)
mov    $0xe000e104,%eax
movq   $0x8000000,(%rax)
mov    $0xe000e104,%eax
movq   $0x10000000,(%rax)
jmp    13f3 <xIntEnable+0x2f3>
jmp    13f8 <xIntEnable+0x2f8>
jmp    13fd <xIntEnable+0x2fd>
jmp    1402 <xIntEnable+0x302>
jmp    1407 <xIntEnable+0x307>
jmp    140c <xIntEnable+0x30c>
jmp    1411 <xIntEnable+0x311>
jmp    1416 <xIntEnable+0x316>
jmp    141b <xIntEnable+0x31b>
pop    %rbp
ret

x86 assembly (clang, -O2):
<xIntEnable>:
mov    %rdi,%rax
lea    -0x4(%rdi),%rcx
cmp    $0xb,%rcx
ja     1150 <xIntEnable+0x50>
lea    0xeec(%rip),%rdx
movslq (%rdx,%rcx,4),%rcx
add    %rdx,%rcx
jmp    *%rcx
mov    $0xe000e100,%eax
orq    $0x10000,0xc24(%rax)
ret
mov    $0xe000e100,%eax
orq    $0x20000,0xc24(%rax)
ret
mov    $0xe000e100,%eax
orq    $0x40000,0xc24(%rax)
ret
movzbl %al,%ecx
add    $0xfffffffffffffff0,%rcx
cmp    $0x43,%rcx
jbe    116a <xIntEnable+0x6a>
movzbl %ah,%ecx
add    $0xfffffffffffffff0,%rcx
cmp    $0x44,%rcx
ja     118f <xIntEnable+0x8f>
mov    $0x1,%eax
shl    %cl,%eax
cltq
shr    $0x5,%rcx
mov    $0xe000e100,%edx
mov    %rax,(%rdx,%rcx,4)
ret
mov    $0xe000e100,%eax
orq    $0x2,-0xf0(%rax)
02
ret
cmp    $0x1020ffff,%rax
jg     11e6 <xIntEnable+0xe6>
cmp    $0x8290000,%rax
je     1232 <xIntEnable+0x132>
cmp    $0x9110000,%rax
jne    1281 <xIntEnable+0x181>
mov    $0xe000e100,%eax
movq   $0x800,(%rax)
movq   $0x1000,(%rax)
movq   $0x2000,(%rax)
movq   $0x4000,(%rax)
movq   $0x8000,(%rax)
movq   $0x10000,(%rax)
movq   $0x20000,(%rax)
ret
cmp    $0x10210000,%rax
je     1254 <xIntEnable+0x154>
cmp    $0x11030000,%rax
jne    1281 <xIntEnable+0x181>
mov    $0xe000e100,%eax
movq   $0x40,(%rax)
movq   $0x80,(%rax)
movq   $0x100,(%rax)
movq   $0x200,(%rax)
movq   $0x400,(%rax)
movq   $0x800000,(%rax)
movq   $0x100,0x4(%rax)
ret
mov    $0xe000e100,%eax
movq   $0x1000000,(%rax)
movq   $0x2000000,(%rax)
movq   $0x4000000,(%rax)
movq   $0x8000000,(%rax)
ret
mov    $0xe000e100,%eax
movq   $0x1000000,0x4(%rax)
01
movq   $0x2000000,0x4(%rax)
02
movq   $0x4000000,0x4(%rax)
04
movq   $0x8000000,0x4(%rax)
08
movq   $0x10000000,0x4(%rax)
10
ret

LLVM IR (-O0):
define void @xIntEnable(i64 %0) {
%2 = alloca i64
store i64 %0, i64* %2
%3 = load i64, i64* %2
%4 = icmp eq i64 %3, 4
br i1 %4, label %5, label %8
5: ; preds = %1
%6 = load volatile i64, i64* inttoptr (i64 3758157092 to i64*)
%7 = or i64 %6, 65536
store volatile i64 %7, i64* inttoptr (i64 3758157092 to i64*)
br label %101
8: ; preds = %1
%9 = load i64, i64* %2
%10 = icmp eq i64 %9, 5
br i1 %10, label %11, label %14
11: ; preds = %8
%12 = load volatile i64, i64* inttoptr (i64 3758157092 to i64*)
%13 = or i64 %12, 131072
store volatile i64 %13, i64* inttoptr (i64 3758157092 to i64*)
br label %100
14: ; preds = %8
%15 = load i64, i64* %2
%16 = icmp eq i64 %15, 6
br i1 %16, label %17, label %20
17: ; preds = %14
%18 = load volatile i64, i64* inttoptr (i64 3758157092 to i64*)
%19 = or i64 %18, 262144
store volatile i64 %19, i64* inttoptr (i64 3758157092 to i64*)
br label %99
20: ; preds = %14
%21 = load i64, i64* %2
%22 = icmp eq i64 %21, 15
br i1 %22, label %23, label %26
23: ; preds = %20
%24 = load volatile i64, i64* inttoptr (i64 3758153744 to i64*)
%25 = or i64 %24, 2
store volatile i64 %25, i64* inttoptr (i64 3758153744 to i64*)
br label %98
26: ; preds = %20
%27 = load i64, i64* %2
%28 = and i64 %27, 255
%29 = icmp uge i64 %28, 16
br i1 %29, label %30, label %49
30: ; preds = %26
%31 = load i64, i64* %2
%32 = and i64 %31, 255
%33 = icmp ult i64 %32, 84
br i1 %33, label %34, label %49
34: ; preds = %30
%35 = load i64, i64* %2
%36 = and i64 %35, 255
%37 = sub i64 %36, 16
%38 = urem i64 %37, 32
%39 = trunc i64 %38 to i32
%40 = shl i32 1, %39
%41 = sext i32 %40 to i64
%42 = load i64, i64* %2
%43 = and i64 %42, 255
%44 = sub i64 %43, 16
%45 = udiv i64 %44, 32
%46 = mul i64 %45, 4
%47 = add i64 3758153984, %46
%48 = inttoptr i64 %47 to i64*
store volatile i64 %41, i64* %48
br label %97
49: ; preds = %30, %26
%50 = load i64, i64* %2
%51 = lshr i64 %50, 8
%52 = and i64 %51, 255
%53 = icmp uge i64 %52, 16
br i1 %53, label %54, label %76
54: ; preds = %49
%55 = load i64, i64* %2
%56 = lshr i64 %55, 8
%57 = and i64 %56, 255
%58 = icmp ule i64 %57, 84
br i1 %58, label %59, label %76
59: ; preds = %54
%60 = load i64, i64* %2
%61 = lshr i64 %60, 8
%62 = and i64 %61, 255
%63 = sub i64 %62, 16
%64 = urem i64 %63, 32
%65 = trunc i64 %64 to i32
%66 = shl i32 1, %65
%67 = sext i32 %66 to i64
%68 = load i64, i64* %2
%69 = lshr i64 %68, 8
%70 = and i64 %69, 255
%71 = sub i64 %70, 16
%72 = udiv i64 %71, 32
%73 = mul i64 %72, 4
%74 = add i64 3758153984, %73
%75 = inttoptr i64 %74 to i64*
store volatile i64 %67, i64* %75
br label %96
76: ; preds = %54, %49
%77 = load i64, i64* %2
%78 = icmp eq i64 %77, 136904704
br i1 %78, label %79, label %80
79: ; preds = %76
store volatile i64 16777216, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 33554432, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 67108864, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 134217728, i64* inttoptr (i64 3758153984 to i64*)
br label %95
80: ; preds = %76
%81 = load i64, i64* %2
%82 = icmp eq i64 %81, 285409280
br i1 %82, label %83, label %84
83: ; preds = %80
store volatile i64 64, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 128, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 256, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 512, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 1024, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 8388608, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 256, i64* inttoptr (i64 3758153988 to i64*)
br label %94
84: ; preds = %80
%85 = load i64, i64* %2
%86 = icmp eq i64 %85, 152109056
br i1 %86, label %87, label %88
87: ; preds = %84
store volatile i64 2048, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 4096, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 8192, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 16384, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 32768, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 65536, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 131072, i64* inttoptr (i64 3758153984 to i64*)
br label %93
88: ; preds = %84
%89 = load i64, i64* %2
%90 = icmp eq i64 %89, 270598144
br i1 %90, label %91, label %92
91: ; preds = %88
store volatile i64 16777216, i64* inttoptr (i64 3758153988 to i64*)
store volatile i64 33554432, i64* inttoptr (i64 3758153988 to i64*)
store volatile i64 67108864, i64* inttoptr (i64 3758153988 to i64*)
store volatile i64 134217728, i64* inttoptr (i64 3758153988 to i64*)
store volatile i64 268435456, i64* inttoptr (i64 3758153988 to i64*)
br label %92
92: ; preds = %91, %88
br label %93
93: ; preds = %92, %87
br label %94
94: ; preds = %93, %83
br label %95
95: ; preds = %94, %79
br label %96
96: ; preds = %95, %59
br label %97
97: ; preds = %96, %34
br label %98
98: ; preds = %97, %23
br label %99
99: ; preds = %98, %17
br label %100
100: ; preds = %99, %11
br label %101
101: ; preds = %100, %5
ret void
}

LLVM IR (-O2):
define void @xIntEnable(i64 %0) {
switch i64 %0, label %14 [
i64 4, label %2
i64 5, label %5
i64 6, label %8
i64 15, label %11
]
2: ; preds = %1
%3 = load volatile i64, i64* inttoptr (i64 3758157092 to i64*)
%4 = or i64 %3, 65536
store volatile i64 %4, i64* inttoptr (i64 3758157092 to i64*)
br label %46
5: ; preds = %1
%6 = load volatile i64, i64* inttoptr (i64 3758157092 to i64*)
%7 = or i64 %6, 131072
store volatile i64 %7, i64* inttoptr (i64 3758157092 to i64*)
br label %46
8: ; preds = %1
%9 = load volatile i64, i64* inttoptr (i64 3758157092 to i64*)
%10 = or i64 %9, 262144
store volatile i64 %10, i64* inttoptr (i64 3758157092 to i64*)
br label %46
11: ; preds = %1
%12 = load volatile i64, i64* inttoptr (i64 3758153744 to i64*)
%13 = or i64 %12, 2
store volatile i64 %13, i64* inttoptr (i64 3758153744 to i64*)
br label %46
14: ; preds = %1
%15 = and i64 %0, 255
%16 = add nsw i64 %15, -16
%17 = icmp ult i64 %16, 68
br i1 %17, label %18, label %27
18: ; preds = %14
%19 = trunc i64 %16 to i32
%20 = and i32 %19, 31
%21 = shl nuw i32 1, %20
%22 = sext i32 %21 to i64
%23 = lshr i64 %16, 3
%24 = and i64 %23, 2305843009213693948
%25 = add nuw nsw i64 %24, 3758153984
%26 = inttoptr i64 %25 to i64*
store volatile i64 %22, i64* %26
br label %46
27: ; preds = %14
%28 = lshr i64 %0, 8
%29 = and i64 %28, 255
%30 = add nsw i64 %29, -16
%31 = icmp ult i64 %30, 69
br i1 %31, label %32, label %41
32: ; preds = %27
%33 = trunc i64 %30 to i32
%34 = and i32 %33, 31
%35 = shl nuw i32 1, %34
%36 = sext i32 %35 to i64
%37 = lshr i64 %30, 3
%38 = and i64 %37, 2305843009213693948
%39 = add nuw nsw i64 %38, 3758153984
%40 = inttoptr i64 %39 to i64*
store volatile i64 %36, i64* %40
br label %46
41: ; preds = %27
switch i64 %0, label %46 [
i64 136904704, label %42
i64 285409280, label %43
i64 152109056, label %44
i64 270598144, label %45
]
42: ; preds = %41
store volatile i64 16777216, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 33554432, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 67108864, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 134217728, i64* inttoptr (i64 3758153984 to i64*)
br label %46
43: ; preds = %41
store volatile i64 64, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 128, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 256, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 512, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 1024, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 8388608, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 256, i64* inttoptr (i64 3758153988 to i64*)
br label %46
44: ; preds = %41
store volatile i64 2048, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 4096, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 8192, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 16384, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 32768, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 65536, i64* inttoptr (i64 3758153984 to i64*)
store volatile i64 131072, i64* inttoptr (i64 3758153984 to i64*)
br label %46
45: ; preds = %41
store volatile i64 16777216, i64* inttoptr (i64 3758153988 to i64*)
store volatile i64 33554432, i64* inttoptr (i64 3758153988 to i64*)
store volatile i64 67108864, i64* inttoptr (i64 3758153988 to i64*)
store volatile i64 134217728, i64* inttoptr (i64 3758153988 to i64*)
store volatile i64 268435456, i64* inttoptr (i64 3758153988 to i64*)
br label %46
46: ; preds = %41, %5, %11, %32, %43, %45, %44, %42, %18, %8, %2
ret void
}