user: 请从给定的汇编指令推导出C源代码：

```asm
<pnx833x_gpio_setup_irq>:
  endbr64
  mov    $0x1,%eax
  mov    %esi,%ecx
  shl    %cl,%eax
  cmp    $0x5,%edi
  ja     L5
  lea    D9(%rip),%rcx
  mov    %edi,%edi
  movslq (%rcx,%rdi,4),%rdx
  add    %rcx,%rdx
  notrack jmp *%rdx
  nopl   0x0(%rax)
  mov    $0xb7e0f020,%ecx
  cltq
  mov    (%rcx),%rdx
  or     %rax,%rdx
  mov    %rdx,(%rcx)
  mov    0x4(%rcx),%rdx
  or     %rax,%rdx
  mov    %rdx,0x4(%rcx)
  mov    $0xb7e0f028,%edx
  mov    (%rdx),%rcx
  or     %rcx,%rax
  mov    %rax,(%rdx)
  ret
  nopw   0x0(%rax,%rax,1)
  mov    $0xb7e0f020,%esi
  mov    %eax,%edx
  cltq
  mov    (%rsi),%rcx
  not    %edx
  movslq %edx,%rdx
  and    %rdx,%rcx
  mov    %rcx,(%rsi)
  mov    $0xb7e0f024,%ecx
  mov    (%rcx),%rsi
  and    %rsi,%rdx
  mov    %rdx,(%rcx)
  mov    $0xb7e0f028,%edx
  mov    (%rdx),%rcx
  or     %rcx,%rax
  mov    %rax,(%rdx)
  ret
  nopl   0x0(%rax)
  mov    $0xb7e0f020,%esi
  mov    %eax,%edx
  cltq
  mov    (%rsi),%rcx
  not    %edx
  movslq %edx,%rdx
  and    %rdx,%rcx
  mov    %rcx,(%rsi)
  mov    $0xb7e0f024,%ecx
  mov    (%rcx),%rsi
  or     %rsi,%rax
  mov    %rax,(%rcx)
  mov    $0xb7e0f028,%eax
  mov    (%rax),%rcx
  and    %rcx,%rdx
  mov    %rdx,(%rax)
  ret
  nopl   0x0(%rax)
  mov    $0xb7e0f020,%esi
  movslq %eax,%rdx
  not    %eax
  mov    (%rsi),%rcx
  cltq
  or     %rdx,%rcx
  mov    %rcx,(%rsi)
  mov    $0xb7e0f024,%ecx
  mov    (%rcx),%rsi
  or     %rsi,%rdx
  mov    %rdx,(%rcx)
  mov    $0xb7e0f028,%edx
  mov    (%rdx),%rcx
  and    %rcx,%rax
  mov    %rax,(%rdx)
  ret
  nopw   0x0(%rax,%rax,1)
  mov    $0xb7e0f020,%esi
  movslq %eax,%rdx
  not    %eax
  mov    (%rsi),%rcx
  cltq
  or     %rdx,%rcx
  mov    %rcx,(%rsi)
  mov    $0xb7e0f024,%ecx
  mov    (%rcx),%rsi
  and    %rsi,%rax
  mov    %rax,(%rcx)
  mov    $0xb7e0f028,%eax
  mov    (%rax),%rcx
  or     %rcx,%rdx
  mov    %rdx,(%rax)
  ret
L5:
  mov    $0xb7e0f020,%ecx
  not    %eax
  mov    (%rcx),%rdx
  cltq
  and    %rax,%rdx
  mov    %rdx,(%rcx)
  mov    0x4(%rcx),%rdx
  and    %rax,%rdx
  mov    %rdx,0x4(%rcx)
  mov    $0xb7e0f028,%edx
  mov    (%rdx),%rcx
  and    %rcx,%rax
  mov    %rax,(%rdx)
  ret
```

assistant: ```c
void pnx833x_gpio_setup_irq(int when, unsigned int pin) {
  switch (when) {
  case 1:
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF020))) &= ~(1 << (pin)));
    } while (0);
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF024))) &= ~(1 << (pin)));
    } while (0);
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF028))) |= (1 << (pin)));
    } while (0);
    break;
  case 2:
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF020))) &= ~(1 << (pin)));
    } while (0);
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF024))) |= (1 << (pin)));
    } while (0);
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF028))) &= ~(1 << (pin)));
    } while (0);
    break;
  case 3:
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF020))) |= (1 << (pin)));
    } while (0);
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF024))) |= (1 << (pin)));
    } while (0);
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF028))) &= ~(1 << (pin)));
    } while (0);
    break;
  case 4:
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF020))) |= (1 << (pin)));
    } while (0);
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF024))) &= ~(1 << (pin)));
    } while (0);
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF028))) |= (1 << (pin)));
    } while (0);
    break;
  case 5:
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF020))) |= (1 << (pin)));
    } while (0);
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF024))) |= (1 << (pin)));
    } while (0);
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF028))) |= (1 << (pin)));
    } while (0);
    break;
  default:
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF020))) &= ~(1 << (pin)));
    } while (0);
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF024))) &= ~(1 << (pin)));
    } while (0);
    do {
      ((*((volatile unsigned long *)((0xa0000000ul + 0x17E00000ul) + 0xF028))) &= ~(1 << (pin)));
    } while (0);
    break;
  }
}
```