void GPIOPinIntEnable(unsigned long ulPort, unsigned long ulPins,
                      unsigned long ulIntType) {
  unsigned long ulBit;
  ;

  ;
  for (ulBit = 0; ulBit < 16; ulBit++) {
    if (((ulPins >> ulBit) & 1) != 0) {
      (*((volatile unsigned long *)(0x40010008 + (ulBit >> 2) * 4))) &=
          ~(0x0000000F << (ulBit % 4) * 4);
      (*((volatile unsigned long *)(0x40010008 + (ulBit >> 2) * 4))) |=
          ((((ulPort & 0xFFFF) >> 10) - 2) << (ulBit % 4) * 4);
      (*((volatile unsigned long *)(0x40010408))) =
          ((ulIntType & 2)
               ? ((*((volatile unsigned long *)(0x40010408))) | (1 << ulBit))
               : ((*((volatile unsigned long *)(0x40010408))) & ~(1 << ulBit)));
      (*((volatile unsigned long *)(0x4001040C))) =
          ((ulIntType & 1)
               ? ((*((volatile unsigned long *)(0x4001040C))) | (1 << ulBit))
               : ((*((volatile unsigned long *)(0x4001040C))) & ~(1 << ulBit)));
      (*((volatile unsigned long *)(0x40010400))) |= (1 << ulBit);
    }
  }
}


x86 assembly (clang, -O0):
<GPIOPinIntEnable>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movq   $0x0,-0x20(%rbp)
cmpq   $0x10,-0x20(%rbp)
jae    12af <GPIOPinIntEnable+0x1af>
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%rcx
shr    %cl,%rax
and    $0x1,%rax
cmp    $0x0,%rax
je     1299 <GPIOPinIntEnable+0x199>
mov    -0x20(%rbp),%rax
and    $0x3,%rax
shl    $0x2,%rax
mov    %eax,%ecx
mov    $0xf,%eax
shl    %cl,%eax
xor    $0xffffffff,%eax
movslq %eax,%rdx
mov    -0x20(%rbp),%rax
shr    $0x2,%rax
shl    $0x2,%rax
add    $0x40010008,%rax
mov    (%rax),%rcx
and    %rdx,%rcx
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rdx
and    $0xffff,%rdx
shr    $0xa,%rdx
sub    $0x2,%rdx
mov    -0x20(%rbp),%rcx
and    $0x3,%rcx
shl    $0x2,%rcx
shl    %cl,%rdx
mov    -0x20(%rbp),%rax
shr    $0x2,%rax
shl    $0x2,%rax
add    $0x40010008,%rax
mov    (%rax),%rcx
or     %rdx,%rcx
mov    %rcx,(%rax)
mov    -0x18(%rbp),%rax
and    $0x2,%rax
cmp    $0x0,%rax
je     11e5 <GPIOPinIntEnable+0xe5>
mov    $0x40010408,%eax
mov    (%rax),%rax
mov    -0x20(%rbp),%rcx
mov    $0x1,%edx
shl    %cl,%edx
mov    %edx,%ecx
movslq %ecx,%rcx
or     %rcx,%rax
mov    %rax,-0x28(%rbp)
jmp    1207 <GPIOPinIntEnable+0x107>
mov    $0x40010408,%eax
mov    (%rax),%rax
mov    -0x20(%rbp),%rcx
mov    $0x1,%edx
shl    %cl,%edx
mov    %edx,%ecx
xor    $0xffffffff,%ecx
movslq %ecx,%rcx
and    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rcx
mov    $0x40010408,%eax
mov    %rcx,(%rax)
mov    -0x18(%rbp),%rax
and    $0x1,%rax
cmp    $0x0,%rax
je     1249 <GPIOPinIntEnable+0x149>
mov    $0x4001040c,%eax
mov    (%rax),%rax
mov    -0x20(%rbp),%rcx
mov    $0x1,%edx
shl    %cl,%edx
mov    %edx,%ecx
movslq %ecx,%rcx
or     %rcx,%rax
mov    %rax,-0x30(%rbp)
jmp    126b <GPIOPinIntEnable+0x16b>
mov    $0x4001040c,%eax
mov    (%rax),%rax
mov    -0x20(%rbp),%rcx
mov    $0x1,%edx
shl    %cl,%edx
mov    %edx,%ecx
xor    $0xffffffff,%ecx
movslq %ecx,%rcx
and    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rcx
mov    $0x4001040c,%eax
mov    %rcx,(%rax)
mov    -0x20(%rbp),%rax
mov    %eax,%ecx
mov    $0x1,%eax
shl    %cl,%eax
cltq
mov    $0x40010400,%ecx
mov    (%rcx),%rcx
or     %rax,%rcx
mov    $0x40010400,%eax
mov    %rcx,(%rax)
jmp    129e <GPIOPinIntEnable+0x19e>
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1118 <GPIOPinIntEnable+0x18>
pop    %rbp
ret

x86 assembly (clang, -O2):
<GPIOPinIntEnable>:
push   %rbp
push   %rbx
shr    $0xa,%edi
and    $0x3f,%edi
add    $0xfffffffffffffffe,%rdi
xor    %r8d,%r8d
movabs $0x7ffffffffffffffc,%r9
ff ff 7f
xor    %r10d,%r10d
jmp    1132 <GPIOPinIntEnable+0x32>
xchg   %ax,%ax
add    $0x1,%r10
add    $0x4,%r8
cmp    $0x40,%r8
je     11c0 <GPIOPinIntEnable+0xc0>
bt     %r10,%rsi
jae    1120 <GPIOPinIntEnable+0x20>
mov    %r8d,%ecx
and    $0xc,%cl
mov    $0xf,%eax
shl    %cl,%eax
not    %eax
movslq %eax,%r11
lea    0x40010008(%r10),%rax
and    %r9,%rax
and    %r11,(%rax)
mov    %rdi,%r11
shl    %cl,%r11
or     %r11,(%rax)
mov    $0x1,%r11d
mov    %r10d,%ecx
shl    %cl,%r11d
mov    0x40010408,%rax
40
mov    %rax,%rbx
or     %r11,%rbx
mov    $0xfffffffe,%ebp
rol    %cl,%ebp
movslq %ebp,%rcx
and    %rcx,%rax
test   $0x2,%dl
cmovne %rbx,%rax
mov    %rax,0x40010408
40
mov    0x4001040c,%rax
40
and    %rax,%rcx
or     %r11,%rax
test   $0x1,%dl
cmove  %rcx,%rax
mov    %rax,0x4001040c
40
or     %r11,0x40010400
40
jmp    1120 <GPIOPinIntEnable+0x20>
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define void @GPIOPinIntEnable(i64 %0, i64 %1, i64 %2) {
%4 = alloca i64
%5 = alloca i64
%6 = alloca i64
%7 = alloca i64
store i64 %0, i64* %4
store i64 %1, i64* %5
store i64 %2, i64* %6
store i64 0, i64* %7
br label %8
8: ; preds = %94, %3
%9 = load i64, i64* %7
%10 = icmp ult i64 %9, 16
br i1 %10, label %11, label %97
11: ; preds = %8
%12 = load i64, i64* %5
%13 = load i64, i64* %7
%14 = lshr i64 %12, %13
%15 = and i64 %14, 1
%16 = icmp ne i64 %15, 0
br i1 %16, label %17, label %93
17: ; preds = %11
%18 = load i64, i64* %7
%19 = urem i64 %18, 4
%20 = mul i64 %19, 4
%21 = trunc i64 %20 to i32
%22 = shl i32 15, %21
%23 = xor i32 %22, -1
%24 = sext i32 %23 to i64
%25 = load i64, i64* %7
%26 = lshr i64 %25, 2
%27 = mul i64 %26, 4
%28 = add i64 1073807368, %27
%29 = inttoptr i64 %28 to i64*
%30 = load volatile i64, i64* %29
%31 = and i64 %30, %24
store volatile i64 %31, i64* %29
%32 = load i64, i64* %4
%33 = and i64 %32, 65535
%34 = lshr i64 %33, 10
%35 = sub i64 %34, 2
%36 = load i64, i64* %7
%37 = urem i64 %36, 4
%38 = mul i64 %37, 4
%39 = shl i64 %35, %38
%40 = load i64, i64* %7
%41 = lshr i64 %40, 2
%42 = mul i64 %41, 4
%43 = add i64 1073807368, %42
%44 = inttoptr i64 %43 to i64*
%45 = load volatile i64, i64* %44
%46 = or i64 %45, %39
store volatile i64 %46, i64* %44
%47 = load i64, i64* %6
%48 = and i64 %47, 2
%49 = icmp ne i64 %48, 0
br i1 %49, label %50, label %57
50: ; preds = %17
%51 = load volatile i64, i64* inttoptr (i64 1073808392 to i64*)
%52 = load i64, i64* %7
%53 = trunc i64 %52 to i32
%54 = shl i32 1, %53
%55 = sext i32 %54 to i64
%56 = or i64 %51, %55
br label %65
57: ; preds = %17
%58 = load volatile i64, i64* inttoptr (i64 1073808392 to i64*)
%59 = load i64, i64* %7
%60 = trunc i64 %59 to i32
%61 = shl i32 1, %60
%62 = xor i32 %61, -1
%63 = sext i32 %62 to i64
%64 = and i64 %58, %63
br label %65
65: ; preds = %57, %50
%66 = phi i64 [ %56, %50 ], [ %64, %57 ]
store volatile i64 %66, i64* inttoptr (i64 1073808392 to i64*)
%67 = load i64, i64* %6
%68 = and i64 %67, 1
%69 = icmp ne i64 %68, 0
br i1 %69, label %70, label %77
70: ; preds = %65
%71 = load volatile i64, i64* inttoptr (i64 1073808396 to i64*)
%72 = load i64, i64* %7
%73 = trunc i64 %72 to i32
%74 = shl i32 1, %73
%75 = sext i32 %74 to i64
%76 = or i64 %71, %75
br label %85
77: ; preds = %65
%78 = load volatile i64, i64* inttoptr (i64 1073808396 to i64*)
%79 = load i64, i64* %7
%80 = trunc i64 %79 to i32
%81 = shl i32 1, %80
%82 = xor i32 %81, -1
%83 = sext i32 %82 to i64
%84 = and i64 %78, %83
br label %85
85: ; preds = %77, %70
%86 = phi i64 [ %76, %70 ], [ %84, %77 ]
store volatile i64 %86, i64* inttoptr (i64 1073808396 to i64*)
%87 = load i64, i64* %7
%88 = trunc i64 %87 to i32
%89 = shl i32 1, %88
%90 = sext i32 %89 to i64
%91 = load volatile i64, i64* inttoptr (i64 1073808384 to i64*)
%92 = or i64 %91, %90
store volatile i64 %92, i64* inttoptr (i64 1073808384 to i64*)
br label %93
93: ; preds = %85, %11
br label %94
94: ; preds = %93
%95 = load i64, i64* %7
%96 = add i64 %95, 1
store i64 %96, i64* %7
br label %8
97: ; preds = %8
ret void
}

LLVM IR (-O2):
define void @GPIOPinIntEnable(i64 %0, i64 %1, i64 %2) {
%4 = lshr i64 %0, 10
%5 = and i64 %4, 63
%6 = add nsw i64 %5, -2
%7 = and i64 %2, 2
%8 = icmp eq i64 %7, 0
%9 = and i64 %2, 1
%10 = icmp eq i64 %9, 0
br label %11
11: ; preds = %3, %53
%12 = phi i64 [ 0, %3 ], [ %54, %53 ]
%13 = shl nuw nsw i64 1, %12
%14 = and i64 %13, %1
%15 = icmp eq i64 %14, 0
br i1 %15, label %53, label %16
16: ; preds = %11
%17 = shl nuw nsw i64 %12, 2
%18 = and i64 %17, 12
%19 = trunc i64 %18 to i32
%20 = shl nuw nsw i32 15, %19
%21 = xor i32 %20, -1
%22 = sext i32 %21 to i64
%23 = add nuw nsw i64 %12, 1073807368
%24 = and i64 %23, 9223372036854775804
%25 = inttoptr i64 %24 to i64*
%26 = load volatile i64, i64* %25
%27 = and i64 %26, %22
store volatile i64 %27, i64* %25
%28 = shl nsw i64 %6, %18
%29 = load volatile i64, i64* %25
%30 = or i64 %29, %28
store volatile i64 %30, i64* %25
%31 = load volatile i64, i64* inttoptr (i64 1073808392 to i64*)
%32 = trunc i64 %12 to i32
%33 = shl nuw nsw i32 1, %32
%34 = zext i32 %33 to i64
%35 = or i64 %31, %34
%36 = xor i32 %33, -1
%37 = sext i32 %36 to i64
%38 = and i64 %31, %37
%39 = select i1 %8, i64 %38, i64 %35
store volatile i64 %39, i64* inttoptr (i64 1073808392 to i64*)
%40 = load volatile i64, i64* inttoptr (i64 1073808396 to i64*)
%41 = trunc i64 %12 to i32
%42 = shl nuw nsw i32 1, %41
%43 = xor i32 %42, -1
%44 = sext i32 %43 to i64
%45 = and i64 %40, %44
%46 = zext i32 %42 to i64
%47 = zext i32 %42 to i64
%48 = or i64 %40, %47
%49 = select i1 %10, i64 %46, i64 %47
%50 = select i1 %10, i64 %45, i64 %48
store volatile i64 %50, i64* inttoptr (i64 1073808396 to i64*)
%51 = load volatile i64, i64* inttoptr (i64 1073808384 to i64*)
%52 = or i64 %51, %49
store volatile i64 %52, i64* inttoptr (i64 1073808384 to i64*)
br label %53
53: ; preds = %11, %16
%54 = add nuw nsw i64 %12, 1
%55 = icmp eq i64 %54, 16
br i1 %55, label %56, label %11
56: ; preds = %53
ret void
}