void pxa_gpio_mode(int gpio_mode) {
  int gpio = gpio_mode & 0x07f;
  int fn = (gpio_mode & 0x300) >> 8;
  int gafr;
  if (gpio_mode & 0x400)
    (*((((gpio)&0x7f) < 96)
           ? &(*(volatile unsigned long
                     *)((unsigned long)&(
                            *((volatile unsigned long *)0x40E00024)) +
                        (((gpio)&0x60) >> 3)))
           : &(*((volatile unsigned long *)0x40E00124)))) =
        (1 << ((gpio)&0x1f));
  else if (gpio_mode & 0x800)
    (*((((gpio)&0x7f) < 96)
           ? &(*(volatile unsigned long
                     *)((unsigned long)&(
                            *((volatile unsigned long *)0x40E00018)) +
                        (((gpio)&0x60) >> 3)))
           : &(*((volatile unsigned long *)0x40E00118)))) =
        (1 << ((gpio)&0x1f));
  if (gpio_mode & 0x080)
    (*((((gpio)&0x7f) < 96)
           ? &(*(volatile unsigned long
                     *)((unsigned long)&(
                            *((volatile unsigned long *)0x40E0000C)) +
                        (((gpio)&0x60) >> 3)))
           : &(*((volatile unsigned long *)0x40E0010C)))) |=
        (1 << ((gpio)&0x1f));
  else
    (*((((gpio)&0x7f) < 96)
           ? &(*(volatile unsigned long
                     *)((unsigned long)&(
                            *((volatile unsigned long *)0x40E0000C)) +
                        (((gpio)&0x60) >> 3)))
           : &(*((volatile unsigned long *)0x40E0010C)))) &=
        ~(1 << ((gpio)&0x1f));
  gafr = (*((((gpio)&0x7f) < 96)
                ? &(*(volatile unsigned long
                          *)((unsigned long)&(
                                 *((volatile unsigned long *)0x40E00054)) +
                             (((gpio)&0x70) >> 2)))
                : ((((gpio)&0x7f) < 112)
                       ? &(*((volatile unsigned long *)0x40E0006C))
                       : &(*((volatile unsigned long *)0x40E00070))))) &
         ~(0x3 << (((gpio)&0xf) * 2));
  (*((((gpio)&0x7f) < 96)
         ? &(*(volatile unsigned long
                   *)((unsigned long)&(
                          *((volatile unsigned long *)0x40E00054)) +
                      (((gpio)&0x70) >> 2)))
         : ((((gpio)&0x7f) < 112)
                ? &(*((volatile unsigned long *)0x40E0006C))
                : &(*((volatile unsigned long *)0x40E00070))))) =
      gafr | (fn << (((gpio)&0xf) * 2));
}


x86 assembly (clang, -O0):
<pxa_gpio_mode>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    -0x4(%rbp),%eax
and    $0x7f,%eax
mov    %eax,-0x8(%rbp)
mov    -0x4(%rbp),%eax
and    $0x300,%eax
sar    $0x8,%eax
mov    %eax,-0xc(%rbp)
mov    -0x4(%rbp),%eax
and    $0x400,%eax
cmp    $0x0,%eax
je     1189 <pxa_gpio_mode+0x89>
mov    -0x8(%rbp),%ecx
and    $0x1f,%ecx
mov    $0x1,%eax
shl    %cl,%eax
cltq
mov    %rax,-0x18(%rbp)
mov    -0x8(%rbp),%eax
and    $0x7f,%eax
cmp    $0x60,%eax
jge    116b <pxa_gpio_mode+0x6b>
mov    -0x8(%rbp),%eax
and    $0x60,%eax
sar    $0x3,%eax
cltq
add    $0x40e00024,%rax
mov    %rax,-0x20(%rbp)
jmp    1179 <pxa_gpio_mode+0x79>
mov    $0x40e00124,%eax
mov    %rax,-0x20(%rbp)
jmp    1179 <pxa_gpio_mode+0x79>
mov    -0x18(%rbp),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
jmp    11f4 <pxa_gpio_mode+0xf4>
mov    -0x4(%rbp),%eax
and    $0x800,%eax
cmp    $0x0,%eax
je     11ef <pxa_gpio_mode+0xef>
mov    -0x8(%rbp),%ecx
and    $0x1f,%ecx
mov    $0x1,%eax
shl    %cl,%eax
cltq
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%eax
and    $0x7f,%eax
cmp    $0x60,%eax
jge    11d6 <pxa_gpio_mode+0xd6>
mov    -0x8(%rbp),%eax
and    $0x60,%eax
sar    $0x3,%eax
cltq
add    $0x40e00018,%rax
mov    %rax,-0x30(%rbp)
jmp    11e4 <pxa_gpio_mode+0xe4>
mov    $0x40e00118,%eax
mov    %rax,-0x30(%rbp)
jmp    11e4 <pxa_gpio_mode+0xe4>
mov    -0x28(%rbp),%rcx
mov    -0x30(%rbp),%rax
mov    %rcx,(%rax)
jmp    11f4 <pxa_gpio_mode+0xf4>
mov    -0x4(%rbp),%eax
and    $0x80,%eax
cmp    $0x0,%eax
je     1265 <pxa_gpio_mode+0x165>
mov    -0x8(%rbp),%ecx
and    $0x1f,%ecx
mov    $0x1,%eax
shl    %cl,%eax
cltq
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%eax
and    $0x7f,%eax
cmp    $0x60,%eax
jge    1241 <pxa_gpio_mode+0x141>
mov    -0x8(%rbp),%eax
and    $0x60,%eax
sar    $0x3,%eax
cltq
add    $0x40e0000c,%rax
mov    %rax,-0x40(%rbp)
jmp    124f <pxa_gpio_mode+0x14f>
mov    $0x40e0010c,%eax
mov    %rax,-0x40(%rbp)
jmp    124f <pxa_gpio_mode+0x14f>
mov    -0x38(%rbp),%rdx
mov    -0x40(%rbp),%rax
mov    (%rax),%rcx
or     %rdx,%rcx
mov    %rcx,(%rax)
jmp    12c3 <pxa_gpio_mode+0x1c3>
mov    -0x8(%rbp),%ecx
and    $0x1f,%ecx
mov    $0x1,%eax
shl    %cl,%eax
xor    $0xffffffff,%eax
cltq
mov    %rax,-0x48(%rbp)
mov    -0x8(%rbp),%eax
and    $0x7f,%eax
cmp    $0x60,%eax
jge    12a4 <pxa_gpio_mode+0x1a4>
mov    -0x8(%rbp),%eax
and    $0x60,%eax
sar    $0x3,%eax
cltq
add    $0x40e0000c,%rax
mov    %rax,-0x50(%rbp)
jmp    12b2 <pxa_gpio_mode+0x1b2>
mov    $0x40e0010c,%eax
mov    %rax,-0x50(%rbp)
jmp    12b2 <pxa_gpio_mode+0x1b2>
mov    -0x48(%rbp),%rdx
mov    -0x50(%rbp),%rax
mov    (%rax),%rcx
and    %rdx,%rcx
mov    %rcx,(%rax)
mov    -0x8(%rbp),%eax
and    $0x7f,%eax
cmp    $0x60,%eax
jge    12ec <pxa_gpio_mode+0x1ec>
mov    -0x8(%rbp),%eax
and    $0x70,%eax
sar    $0x2,%eax
cltq
add    $0x40e00054,%rax
mov    %rax,-0x58(%rbp)
jmp    1307 <pxa_gpio_mode+0x207>
mov    -0x8(%rbp),%edx
and    $0x7f,%edx
mov    $0x40e00070,%eax
mov    $0x40e0006c,%ecx
cmp    $0x70,%edx
cmovl  %rcx,%rax
mov    %rax,-0x58(%rbp)
mov    -0x58(%rbp),%rax
mov    (%rax),%rax
mov    -0x8(%rbp),%ecx
and    $0xf,%ecx
shl    $0x1,%ecx
mov    $0x3,%edx
shl    %cl,%edx
mov    %edx,%ecx
xor    $0xffffffff,%ecx
movslq %ecx,%rcx
and    %rcx,%rax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    -0xc(%rbp),%edx
mov    -0x8(%rbp),%ecx
and    $0xf,%ecx
shl    $0x1,%ecx
shl    %cl,%edx
mov    %edx,%ecx
or     %ecx,%eax
cltq
mov    %rax,-0x60(%rbp)
mov    -0x8(%rbp),%eax
and    $0x7f,%eax
cmp    $0x60,%eax
jge    1370 <pxa_gpio_mode+0x270>
mov    -0x8(%rbp),%eax
and    $0x70,%eax
sar    $0x2,%eax
cltq
add    $0x40e00054,%rax
mov    %rax,-0x68(%rbp)
jmp    138b <pxa_gpio_mode+0x28b>
mov    -0x8(%rbp),%edx
and    $0x7f,%edx
mov    $0x40e00070,%eax
mov    $0x40e0006c,%ecx
cmp    $0x70,%edx
cmovl  %rcx,%rax
mov    %rax,-0x68(%rbp)
mov    -0x60(%rbp),%rcx
mov    -0x68(%rbp),%rax
mov    %rcx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<pxa_gpio_mode>:
mov    %edi,%eax
and    $0x7f,%eax
test   $0x400,%edi
jne    1122 <pxa_gpio_mode+0x22>
test   $0x800,%edi
je     114d <pxa_gpio_mode+0x4d>
mov    $0x40e00118,%r8d
mov    $0x40e00018,%esi
jmp    112d <pxa_gpio_mode+0x2d>
mov    $0x40e00124,%r8d
mov    $0x40e00024,%esi
mov    $0x1,%edx
mov    %edi,%ecx
shl    %cl,%edx
movslq %edx,%rcx
mov    %edi,%edx
shr    $0x3,%edx
and    $0xc,%edx
add    %esi,%edx
cmp    $0x60,%eax
cmovae %r8,%rdx
mov    %rcx,(%rdx)
mov    $0x1,%edx
mov    %edi,%ecx
shl    %cl,%edx
test   $0x80,%dil
jne    1195 <pxa_gpio_mode+0x95>
not    %edx
mov    %edi,%ecx
shr    $0x3,%ecx
and    $0xc,%ecx
add    $0x40e0000c,%ecx
cmp    $0x60,%eax
mov    $0x40e0010c,%esi
cmovb  %rcx,%rsi
movslq %edx,%rcx
and    %rcx,(%rsi)
cmp    $0x5f,%eax
jbe    11ba <pxa_gpio_mode+0xba>
xor    %ecx,%ecx
cmp    $0x70,%eax
setae  %cl
lea    0x40e0006c(,%rcx,4),%rax
40
jmp    11c7 <pxa_gpio_mode+0xc7>
mov    %edi,%ecx
shr    $0x3,%ecx
and    $0xc,%ecx
add    $0x40e0000c,%ecx
cmp    $0x60,%eax
mov    $0x40e0010c,%esi
cmovb  %rcx,%rsi
movslq %edx,%rcx
or     %rcx,(%rsi)
cmp    $0x5f,%eax
ja     1183 <pxa_gpio_mode+0x83>
mov    %edi,%eax
shr    $0x2,%eax
and    $0x1c,%eax
add    $0x40e00054,%eax
lea    (%rdi,%rdi,1),%ecx
mov    $0x3,%edx
shl    %cl,%edx
mov    (%rax),%rsi
not    %edx
shr    $0x8,%edi
and    $0x3,%edi
shl    %cl,%edi
and    %esi,%edx
or     %edx,%edi
movslq %edi,%rcx
mov    %rcx,(%rax)
ret

LLVM IR (-O0):
define void @pxa_gpio_mode(i32 %0) {
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
store i32 %0, i32* %2
%6 = load i32, i32* %2
%7 = and i32 %6, 127
store i32 %7, i32* %3
%8 = load i32, i32* %2
%9 = and i32 %8, 768
%10 = ashr i32 %9, 8
store i32 %10, i32* %4
%11 = load i32, i32* %2
%12 = and i32 %11, 1024
%13 = icmp ne i32 %12, 0
br i1 %13, label %14, label %32
14: ; preds = %1
%15 = load i32, i32* %3
%16 = and i32 %15, 31
%17 = shl i32 1, %16
%18 = sext i32 %17 to i64
%19 = load i32, i32* %3
%20 = and i32 %19, 127
%21 = icmp slt i32 %20, 96
br i1 %21, label %22, label %29
22: ; preds = %14
%23 = load i32, i32* %3
%24 = and i32 %23, 96
%25 = ashr i32 %24, 3
%26 = sext i32 %25 to i64
%27 = add i64 1088421924, %26
%28 = inttoptr i64 %27 to i64*
br label %30
29: ; preds = %14
br label %30
30: ; preds = %29, %22
%31 = phi i64* [ %28, %22 ], [ inttoptr (i64 1088422180 to i64*), %29 ]
store volatile i64 %18, i64* %31
br label %55
32: ; preds = %1
%33 = load i32, i32* %2
%34 = and i32 %33, 2048
%35 = icmp ne i32 %34, 0
br i1 %35, label %36, label %54
36: ; preds = %32
%37 = load i32, i32* %3
%38 = and i32 %37, 31
%39 = shl i32 1, %38
%40 = sext i32 %39 to i64
%41 = load i32, i32* %3
%42 = and i32 %41, 127
%43 = icmp slt i32 %42, 96
br i1 %43, label %44, label %51
44: ; preds = %36
%45 = load i32, i32* %3
%46 = and i32 %45, 96
%47 = ashr i32 %46, 3
%48 = sext i32 %47 to i64
%49 = add i64 1088421912, %48
%50 = inttoptr i64 %49 to i64*
br label %52
51: ; preds = %36
br label %52
52: ; preds = %51, %44
%53 = phi i64* [ %50, %44 ], [ inttoptr (i64 1088422168 to i64*), %51 ]
store volatile i64 %40, i64* %53
br label %54
54: ; preds = %52, %32
br label %55
55: ; preds = %54, %30
%56 = load i32, i32* %2
%57 = and i32 %56, 128
%58 = icmp ne i32 %57, 0
br i1 %58, label %59, label %79
59: ; preds = %55
%60 = load i32, i32* %3
%61 = and i32 %60, 31
%62 = shl i32 1, %61
%63 = sext i32 %62 to i64
%64 = load i32, i32* %3
%65 = and i32 %64, 127
%66 = icmp slt i32 %65, 96
br i1 %66, label %67, label %74
67: ; preds = %59
%68 = load i32, i32* %3
%69 = and i32 %68, 96
%70 = ashr i32 %69, 3
%71 = sext i32 %70 to i64
%72 = add i64 1088421900, %71
%73 = inttoptr i64 %72 to i64*
br label %75
74: ; preds = %59
br label %75
75: ; preds = %74, %67
%76 = phi i64* [ %73, %67 ], [ inttoptr (i64 1088422156 to i64*), %74 ]
%77 = load volatile i64, i64* %76
%78 = or i64 %77, %63
store volatile i64 %78, i64* %76
br label %100
79: ; preds = %55
%80 = load i32, i32* %3
%81 = and i32 %80, 31
%82 = shl i32 1, %81
%83 = xor i32 %82, -1
%84 = sext i32 %83 to i64
%85 = load i32, i32* %3
%86 = and i32 %85, 127
%87 = icmp slt i32 %86, 96
br i1 %87, label %88, label %95
88: ; preds = %79
%89 = load i32, i32* %3
%90 = and i32 %89, 96
%91 = ashr i32 %90, 3
%92 = sext i32 %91 to i64
%93 = add i64 1088421900, %92
%94 = inttoptr i64 %93 to i64*
br label %96
95: ; preds = %79
br label %96
96: ; preds = %95, %88
%97 = phi i64* [ %94, %88 ], [ inttoptr (i64 1088422156 to i64*), %95 ]
%98 = load volatile i64, i64* %97
%99 = and i64 %98, %84
store volatile i64 %99, i64* %97
br label %100
100: ; preds = %96, %75
%101 = load i32, i32* %3
%102 = and i32 %101, 127
%103 = icmp slt i32 %102, 96
br i1 %103, label %104, label %111
104: ; preds = %100
%105 = load i32, i32* %3
%106 = and i32 %105, 112
%107 = ashr i32 %106, 2
%108 = sext i32 %107 to i64
%109 = add i64 1088421972, %108
%110 = inttoptr i64 %109 to i64*
br label %117
111: ; preds = %100
%112 = load i32, i32* %3
%113 = and i32 %112, 127
%114 = icmp slt i32 %113, 112
%115 = zext i1 %114 to i64
%116 = select i1 %114, i64* inttoptr (i64 1088421996 to i64*), i64* inttoptr (i64 1088422000 to i64*)
br label %117
117: ; preds = %111, %104
%118 = phi i64* [ %110, %104 ], [ %116, %111 ]
%119 = load volatile i64, i64* %118
%120 = load i32, i32* %3
%121 = and i32 %120, 15
%122 = mul nsw i32 %121, 2
%123 = shl i32 3, %122
%124 = xor i32 %123, -1
%125 = sext i32 %124 to i64
%126 = and i64 %119, %125
%127 = trunc i64 %126 to i32
store i32 %127, i32* %5
%128 = load i32, i32* %5
%129 = load i32, i32* %4
%130 = load i32, i32* %3
%131 = and i32 %130, 15
%132 = mul nsw i32 %131, 2
%133 = shl i32 %129, %132
%134 = or i32 %128, %133
%135 = sext i32 %134 to i64
%136 = load i32, i32* %3
%137 = and i32 %136, 127
%138 = icmp slt i32 %137, 96
br i1 %138, label %139, label %146
139: ; preds = %117
%140 = load i32, i32* %3
%141 = and i32 %140, 112
%142 = ashr i32 %141, 2
%143 = sext i32 %142 to i64
%144 = add i64 1088421972, %143
%145 = inttoptr i64 %144 to i64*
br label %152
146: ; preds = %117
%147 = load i32, i32* %3
%148 = and i32 %147, 127
%149 = icmp slt i32 %148, 112
%150 = zext i1 %149 to i64
%151 = select i1 %149, i64* inttoptr (i64 1088421996 to i64*), i64* inttoptr (i64 1088422000 to i64*)
br label %152
152: ; preds = %146, %139
%153 = phi i64* [ %145, %139 ], [ %151, %146 ]
store volatile i64 %135, i64* %153
ret void
}

LLVM IR (-O2):
define void @pxa_gpio_mode(i32 %0) {
%2 = and i32 %0, 127
%3 = and i32 %0, 1024
%4 = icmp eq i32 %3, 0
br i1 %4, label %5, label %8
5: ; preds = %1
%6 = and i32 %0, 2048
%7 = icmp eq i32 %6, 0
br i1 %7, label %21, label %8
8: ; preds = %5, %1
%9 = phi i32 [ 1088421924, %1 ], [ 1088421912, %5 ]
%10 = phi i64* [ inttoptr (i64 1088422180 to i64*), %1 ], [ inttoptr (i64 1088422168 to i64*), %5 ]
%11 = and i32 %0, 31
%12 = shl nuw i32 1, %11
%13 = sext i32 %12 to i64
%14 = icmp ult i32 %2, 96
%15 = lshr i32 %0, 3
%16 = and i32 %15, 12
%17 = add nuw nsw i32 %16, %9
%18 = zext i32 %17 to i64
%19 = inttoptr i64 %18 to i64*
%20 = select i1 %14, i64* %19, i64* %10
store volatile i64 %13, i64* %20
br label %21
21: ; preds = %8, %5
%22 = and i32 %0, 128
%23 = icmp eq i32 %22, 0
%24 = and i32 %0, 31
%25 = shl nuw i32 1, %24
br i1 %23, label %37, label %26
26: ; preds = %21
%27 = sext i32 %25 to i64
%28 = icmp ult i32 %2, 96
%29 = lshr i32 %0, 3
%30 = and i32 %29, 12
%31 = add nuw nsw i32 %30, 1088421900
%32 = zext i32 %31 to i64
%33 = inttoptr i64 %32 to i64*
%34 = select i1 %28, i64* %33, i64* inttoptr (i64 1088422156 to i64*)
%35 = load volatile i64, i64* %34
%36 = or i64 %35, %27
store volatile i64 %36, i64* %34
br label %49
37: ; preds = %21
%38 = xor i32 %25, -1
%39 = sext i32 %38 to i64
%40 = icmp ult i32 %2, 96
%41 = lshr i32 %0, 3
%42 = and i32 %41, 12
%43 = add nuw nsw i32 %42, 1088421900
%44 = zext i32 %43 to i64
%45 = inttoptr i64 %44 to i64*
%46 = select i1 %40, i64* %45, i64* inttoptr (i64 1088422156 to i64*)
%47 = load volatile i64, i64* %46
%48 = and i64 %47, %39
store volatile i64 %48, i64* %46
br label %49
49: ; preds = %37, %26
%50 = icmp ult i32 %2, 96
br i1 %50, label %51, label %57
51: ; preds = %49
%52 = lshr i32 %0, 2
%53 = and i32 %52, 28
%54 = add nuw nsw i32 %53, 1088421972
%55 = zext i32 %54 to i64
%56 = inttoptr i64 %55 to i64*
br label %60
57: ; preds = %49
%58 = icmp ult i32 %2, 112
%59 = select i1 %58, i64* inttoptr (i64 1088421996 to i64*), i64* inttoptr (i64 1088422000 to i64*)
br label %60
60: ; preds = %57, %51
%61 = phi i64* [ %56, %51 ], [ %59, %57 ]
%62 = load volatile i64, i64* %61
%63 = shl i32 %0, 1
%64 = and i32 %63, 30
%65 = trunc i64 %62 to i32
%66 = shl nuw i32 3, %64
%67 = xor i32 %66, -1
%68 = and i32 %65, %67
%69 = lshr i32 %0, 8
%70 = and i32 %69, 3
%71 = shl nuw i32 %70, %64
%72 = or i32 %68, %71
%73 = sext i32 %72 to i64
store volatile i64 %73, i64* %61
ret void
}