void xIntPendClear(unsigned long ulInterrupt) {
  ;
  if (ulInterrupt == 14) {
    (*((volatile unsigned long *)(0xE000ED04))) |= 0x08000000;
  } else if (ulInterrupt == 15) {
    (*((volatile unsigned long *)(0xE000ED04))) |= 0x02000000;
  } else if (((ulInterrupt & 0xFF) >= 16) && ((ulInterrupt & 0xFF) < 84)) {
    (*((volatile unsigned long *)(0xE000E280 +
                                  ((ulInterrupt & 0xFF) / 32) * 4))) =
        1 << ((ulInterrupt & 0xFF) % 32);
  } else if ((((ulInterrupt >> 8) & 0xFF) >= 16) &&
             (((ulInterrupt >> 8) & 0xFF) <= 84)) {
    (*((volatile unsigned long *)(0xE000E280 +
                                  (((ulInterrupt >> 8) & 0xFF) / 32) * 4))) =
        1 << (((ulInterrupt >> 8) & 0xFF) % 32);
  } else if (ulInterrupt == 0x08290000) {
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (40 - 16);
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (41 - 16);
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (42 - 16);
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (43 - 16);
  } else if (ulInterrupt == 0x11030000) {
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (22 - 16);
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (23 - 16);
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (24 - 16);
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (25 - 16);
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (26 - 16);
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (39 - 16);
    (*((volatile unsigned long *)(0xE000E284))) = 1 << (56 - 48);
  } else if (ulInterrupt == 0x09110000) {
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (27 - 16);
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (28 - 16);
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (29 - 16);
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (30 - 16);
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (31 - 16);
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (32 - 16);
    (*((volatile unsigned long *)(0xE000E280))) = 1 << (33 - 16);
  } else if (ulInterrupt == 0x10210000) {
    (*((volatile unsigned long *)(0xE000E284))) = 1 << (72 - 48);
    (*((volatile unsigned long *)(0xE000E284))) = 1 << (73 - 48);
    (*((volatile unsigned long *)(0xE000E284))) = 1 << (74 - 48);
    (*((volatile unsigned long *)(0xE000E284))) = 1 << (75 - 48);
    (*((volatile unsigned long *)(0xE000E284))) = 1 << (76 - 48);
  }
}


x86 assembly (clang, -O0):
<xIntPendClear>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
cmpq   $0xe,-0x8(%rbp)
jne    112f <xIntPendClear+0x2f>
mov    $0xe000ed04,%eax
mov    (%rax),%rcx
or     $0x8000000,%rcx
mov    $0xe000ed04,%eax
mov    %rcx,(%rax)
jmp    13b6 <xIntPendClear+0x2b6>
cmpq   $0xf,-0x8(%rbp)
jne    1156 <xIntPendClear+0x56>
mov    $0xe000ed04,%eax
mov    (%rax),%rcx
or     $0x2000000,%rcx
mov    $0xe000ed04,%eax
mov    %rcx,(%rax)
jmp    13b1 <xIntPendClear+0x2b1>
mov    -0x8(%rbp),%rax
and    $0xff,%rax
cmp    $0x10,%rax
jb     11bf <xIntPendClear+0xbf>
mov    -0x8(%rbp),%rax
and    $0xff,%rax
cmp    $0x54,%rax
jae    11bf <xIntPendClear+0xbf>
mov    -0x8(%rbp),%rax
and    $0xff,%rax
and    $0x1f,%rax
mov    %eax,%ecx
mov    $0x1,%eax
shl    %cl,%eax
movslq %eax,%rcx
mov    -0x8(%rbp),%rax
and    $0xff,%rax
shr    $0x5,%rax
shl    $0x2,%rax
movabs $0xe000e280,%rdx
add    %rdx,%rax
mov    %rcx,(%rax)
jmp    13ac <xIntPendClear+0x2ac>
mov    -0x8(%rbp),%rax
shr    $0x8,%rax
and    $0xff,%rax
cmp    $0x10,%rax
jb     1238 <xIntPendClear+0x138>
mov    -0x8(%rbp),%rax
shr    $0x8,%rax
and    $0xff,%rax
cmp    $0x54,%rax
ja     1238 <xIntPendClear+0x138>
mov    -0x8(%rbp),%rax
shr    $0x8,%rax
and    $0xff,%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
shr    $0x5,%rax
shl    $0x2,%rax
movabs $0xe000e280,%rdx
add    %rdx,%rax
mov    %rcx,(%rax)
jmp    13a7 <xIntPendClear+0x2a7>
cmpq   $0x8290000,-0x8(%rbp)
08
jne    127b <xIntPendClear+0x17b>
mov    $0xe000e280,%eax
movq   $0x1000000,(%rax)
mov    $0xe000e280,%eax
movq   $0x2000000,(%rax)
mov    $0xe000e280,%eax
movq   $0x4000000,(%rax)
mov    $0xe000e280,%eax
movq   $0x8000000,(%rax)
jmp    13a2 <xIntPendClear+0x2a2>
cmpq   $0x11030000,-0x8(%rbp)
11
jne    12e2 <xIntPendClear+0x1e2>
mov    $0xe000e280,%eax
movq   $0x40,(%rax)
mov    $0xe000e280,%eax
movq   $0x80,(%rax)
mov    $0xe000e280,%eax
movq   $0x100,(%rax)
mov    $0xe000e280,%eax
movq   $0x200,(%rax)
mov    $0xe000e280,%eax
movq   $0x400,(%rax)
mov    $0xe000e280,%eax
movq   $0x800000,(%rax)
mov    $0xe000e284,%eax
movq   $0x100,(%rax)
jmp    139d <xIntPendClear+0x29d>
cmpq   $0x9110000,-0x8(%rbp)
09
jne    1349 <xIntPendClear+0x249>
mov    $0xe000e280,%eax
movq   $0x800,(%rax)
mov    $0xe000e280,%eax
movq   $0x1000,(%rax)
mov    $0xe000e280,%eax
movq   $0x2000,(%rax)
mov    $0xe000e280,%eax
movq   $0x4000,(%rax)
mov    $0xe000e280,%eax
movq   $0x8000,(%rax)
mov    $0xe000e280,%eax
movq   $0x10000,(%rax)
mov    $0xe000e280,%eax
movq   $0x20000,(%rax)
jmp    1398 <xIntPendClear+0x298>
cmpq   $0x10210000,-0x8(%rbp)
10
jne    1393 <xIntPendClear+0x293>
mov    $0xe000e284,%eax
movq   $0x1000000,(%rax)
mov    $0xe000e284,%eax
movq   $0x2000000,(%rax)
mov    $0xe000e284,%eax
movq   $0x4000000,(%rax)
mov    $0xe000e284,%eax
movq   $0x8000000,(%rax)
mov    $0xe000e284,%eax
movq   $0x10000000,(%rax)
jmp    1398 <xIntPendClear+0x298>
jmp    139d <xIntPendClear+0x29d>
jmp    13a2 <xIntPendClear+0x2a2>
jmp    13a7 <xIntPendClear+0x2a7>
jmp    13ac <xIntPendClear+0x2ac>
jmp    13b1 <xIntPendClear+0x2b1>
jmp    13b6 <xIntPendClear+0x2b6>
pop    %rbp
ret

x86 assembly (clang, -O2):
<xIntPendClear>:
cmp    $0xf,%rdi
je     111d <xIntPendClear+0x1d>
cmp    $0xe,%rdi
jne    112e <xIntPendClear+0x2e>
mov    $0xe000e280,%eax
orq    $0x8000000,0xa84(%rax)
ret
mov    $0xe000e280,%eax
orq    $0x2000000,0xa84(%rax)
ret
movzbl %dil,%eax
add    $0xfffffffffffffff0,%rax
cmp    $0x43,%rax
ja     114d <xIntPendClear+0x4d>
mov    $0x1,%eax
mov    %edi,%ecx
shl    %cl,%eax
cltq
shr    $0x3,%rdi
jmp    116e <xIntPendClear+0x6e>
mov    %rdi,%rcx
shr    $0x8,%rcx
movzbl %cl,%eax
add    $0xfffffffffffffff0,%rax
cmp    $0x44,%rax
ja     117b <xIntPendClear+0x7b>
mov    $0x1,%eax
shl    %cl,%eax
cltq
shr    $0xb,%rdi
and    $0x1c,%edi
mov    $0xe000e280,%ecx
mov    %rax,(%rdi,%rcx,1)
ret
cmp    $0x1020ffff,%rdi
jg     11d5 <xIntPendClear+0xd5>
cmp    $0x8290000,%rdi
je     1223 <xIntPendClear+0x123>
cmp    $0x9110000,%rdi
jne    1272 <xIntPendClear+0x172>
mov    $0xe000e280,%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,%rdi
je     1245 <xIntPendClear+0x145>
cmp    $0x11030000,%rdi
jne    1272 <xIntPendClear+0x172>
mov    $0xe000e280,%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    $0xe000e280,%eax
movq   $0x1000000,(%rax)
movq   $0x2000000,(%rax)
movq   $0x4000000,(%rax)
movq   $0x8000000,(%rax)
ret
mov    $0xe000e280,%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 @xIntPendClear(i64 %0) {
%2 = alloca i64
store i64 %0, i64* %2
%3 = load i64, i64* %2
%4 = icmp eq i64 %3, 14
br i1 %4, label %5, label %8
5: ; preds = %1
%6 = load volatile i64, i64* inttoptr (i64 3758157060 to i64*)
%7 = or i64 %6, 134217728
store volatile i64 %7, i64* inttoptr (i64 3758157060 to i64*)
br label %83
8: ; preds = %1
%9 = load i64, i64* %2
%10 = icmp eq i64 %9, 15
br i1 %10, label %11, label %14
11: ; preds = %8
%12 = load volatile i64, i64* inttoptr (i64 3758157060 to i64*)
%13 = or i64 %12, 33554432
store volatile i64 %13, i64* inttoptr (i64 3758157060 to i64*)
br label %82
14: ; preds = %8
%15 = load i64, i64* %2
%16 = and i64 %15, 255
%17 = icmp uge i64 %16, 16
br i1 %17, label %18, label %35
18: ; preds = %14
%19 = load i64, i64* %2
%20 = and i64 %19, 255
%21 = icmp ult i64 %20, 84
br i1 %21, label %22, label %35
22: ; preds = %18
%23 = load i64, i64* %2
%24 = and i64 %23, 255
%25 = urem i64 %24, 32
%26 = trunc i64 %25 to i32
%27 = shl i32 1, %26
%28 = sext i32 %27 to i64
%29 = load i64, i64* %2
%30 = and i64 %29, 255
%31 = udiv i64 %30, 32
%32 = mul i64 %31, 4
%33 = add i64 3758154368, %32
%34 = inttoptr i64 %33 to i64*
store volatile i64 %28, i64* %34
br label %81
35: ; preds = %18, %14
%36 = load i64, i64* %2
%37 = lshr i64 %36, 8
%38 = and i64 %37, 255
%39 = icmp uge i64 %38, 16
br i1 %39, label %40, label %60
40: ; preds = %35
%41 = load i64, i64* %2
%42 = lshr i64 %41, 8
%43 = and i64 %42, 255
%44 = icmp ule i64 %43, 84
br i1 %44, label %45, label %60
45: ; preds = %40
%46 = load i64, i64* %2
%47 = lshr i64 %46, 8
%48 = and i64 %47, 255
%49 = urem i64 %48, 32
%50 = trunc i64 %49 to i32
%51 = shl i32 1, %50
%52 = sext i32 %51 to i64
%53 = load i64, i64* %2
%54 = lshr i64 %53, 8
%55 = and i64 %54, 255
%56 = udiv i64 %55, 32
%57 = mul i64 %56, 4
%58 = add i64 3758154368, %57
%59 = inttoptr i64 %58 to i64*
store volatile i64 %52, i64* %59
br label %80
60: ; preds = %40, %35
%61 = load i64, i64* %2
%62 = icmp eq i64 %61, 136904704
br i1 %62, label %63, label %64
63: ; preds = %60
store volatile i64 16777216, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 33554432, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 67108864, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 134217728, i64* inttoptr (i64 3758154368 to i64*)
br label %79
64: ; preds = %60
%65 = load i64, i64* %2
%66 = icmp eq i64 %65, 285409280
br i1 %66, label %67, label %68
67: ; preds = %64
store volatile i64 64, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 128, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 256, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 512, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 1024, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 8388608, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 256, i64* inttoptr (i64 3758154372 to i64*)
br label %78
68: ; preds = %64
%69 = load i64, i64* %2
%70 = icmp eq i64 %69, 152109056
br i1 %70, label %71, label %72
71: ; preds = %68
store volatile i64 2048, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 4096, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 8192, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 16384, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 32768, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 65536, i64* inttoptr (i64 3758154368 to i64*)
store volatile i64 131072, i64* inttoptr (i64 3758154368 to i64*)
br label %77
72: ; preds = %68
%73 = load i64, i64* %2
%74 = icmp eq i64 %73, 270598144
br i1 %74, label %75, label %76
75: ; preds = %72
store volatile i64 16777216, i64* inttoptr (i64 3758154372 to i64*)
store volatile i64 33554432, i64* inttoptr (i64 3758154372 to i64*)
store volatile i64 67108864, i64* inttoptr (i64 3758154372 to i64*)
store volatile i64 134217728, i64* inttoptr (i64 3758154372 to i64*)
store volatile i64 268435456, i64* inttoptr (i64 3758154372 to i64*)
br label %76
76: ; preds = %75, %72
br label %77
77: ; preds = %76, %71
br label %78
78: ; preds = %77, %67
br label %79
79: ; preds = %78, %63
br label %80
80: ; preds = %79, %45
br label %81
81: ; preds = %80, %22
br label %82
82: ; preds = %81, %11
br label %83
83: ; preds = %82, %5
ret void
}

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