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

```asm
<GetRSSHash>:
  endbr64
  push   %r13
  mov    %edx,%r13d
  push   %r12
  mov    %ecx,%r12d
  push   %rbp
  mov    %edi,%ebp
  push   %rbx
  mov    %esi,%ebx
  sub    $0x8,%rsp
  mov    D242(%rip),%eax
  test   %eax,%eax
  jne    L118
L174:
  lea    D201(%rip),%rsi
  xor    %r8d,%r8d
  lea    -0x80(%rsi),%rax
  nopl   0x0(%rax)
L319:
  test   %ebp,%ebp
  jns    L130
  xor    (%rax),%r8d
L130:
  add    $0x4,%rax
  add    %ebp,%ebp
  cmp    %rsi,%rax
  jne    L319
  lea    D201(%rip),%rax
  lea    0x80(%rax),%rsi
  nopl   0x0(%rax,%rax,1)
L358:
  test   %ebx,%ebx
  jns    L25
  xor    (%rax),%r8d
L25:
  add    $0x4,%rax
  add    %ebx,%ebx
  cmp    %rsi,%rax
  jne    L358
  test   $0x8000,%r13d
  je     L199
  xor    D165(%rip),%r8d
L199:
  test   $0x4000,%r13d
  je     L38
  xor    D49(%rip),%r8d
L38:
  test   $0x2000,%r13d
  je     L63
  xor    D350(%rip),%r8d
L63:
  test   $0x1000,%r13d
  je     L33
  xor    D320(%rip),%r8d
L33:
  test   $0x800,%r13d
  je     L335
  xor    D187(%rip),%r8d
L335:
  test   $0x400,%r13d
  je     L209
  xor    D192(%rip),%r8d
L209:
  test   $0x200,%r13d
  je     L80
  xor    D42(%rip),%r8d
L80:
  test   $0x100,%r13d
  je     L155
  xor    D153(%rip),%r8d
L155:
  test   $0x80,%r13b
  je     L5
  xor    D271(%rip),%r8d
L5:
  test   $0x40,%r13b
  je     L76
  xor    D228(%rip),%r8d
L76:
  test   $0x20,%r13b
  je     L101
  xor    D52(%rip),%r8d
L101:
  test   $0x10,%r13b
  je     L122
  xor    D206(%rip),%r8d
L122:
  test   $0x8,%r13b
  je     L212
  xor    D144(%rip),%r8d
L212:
  test   $0x4,%r13b
  je     L132
  xor    D328(%rip),%r8d
L132:
  test   $0x2,%r13b
  je     L152
  xor    D2(%rip),%r8d
L152:
  and    $0x1,%r13d
  je     L321
  xor    D89(%rip),%r8d
L321:
  test   $0x8000,%r12d
  je     L9
  xor    D327(%rip),%r8d
L9:
  test   $0x4000,%r12d
  je     L205
  xor    D30(%rip),%r8d
L205:
  test   $0x2000,%r12d
  je     L82
  xor    D286(%rip),%r8d
L82:
  test   $0x1000,%r12d
  je     L257
  xor    D125(%rip),%r8d
L257:
  test   $0x800,%r12d
  je     L245
  xor    D31(%rip),%r8d
L245:
  test   $0x400,%r12d
  je     L303
  xor    D54(%rip),%r8d
L303:
  test   $0x200,%r12d
  je     L288
  xor    D120(%rip),%r8d
L288:
  test   $0x100,%r12d
  je     L116
  xor    D149(%rip),%r8d
L116:
  test   $0x80,%r12b
  je     L317
  xor    D208(%rip),%r8d
L317:
  test   $0x40,%r12b
  je     L90
  xor    D25(%rip),%r8d
L90:
  test   $0x20,%r12b
  je     L244
  xor    D309(%rip),%r8d
L244:
  test   $0x10,%r12b
  je     L273
  xor    D136(%rip),%r8d
L273:
  test   $0x8,%r12b
  je     L69
  xor    D111(%rip),%r8d
L69:
  test   $0x4,%r12b
  je     L278
  xor    D273(%rip),%r8d
L278:
  test   $0x2,%r12b
  je     L232
  xor    D203(%rip),%r8d
L232:
  and    $0x1,%r12d
  je     L178
  xor    D349(%rip),%r8d
L178:
  add    $0x8,%rsp
  mov    %r8d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L118:
  mov    $0x60,%esi
  lea    D16(%rip),%rdi
  call   <BuildKeyCache@plt>
  movl   $0x0,D242(%rip)
  jmp    L174
```

assistant: ```c
uint32_t GetRSSHash(in_addr_t sip, in_addr_t dip, in_port_t sp, in_port_t dp) {
  uint32_t res = 0;
  int i;
  static int first = 1;
  static uint32_t key_cache[96] = {0};
  if (first) {
    BuildKeyCache(key_cache, 96);
    first = 0;
  }
  for (i = 0; i < 32; i++) {
    if (sip & 0x80000000)
      res ^= key_cache[i];
    sip <<= 1;
  }
  for (i = 0; i < 32; i++) {
    if (dip & 0x80000000)
      res ^= key_cache[32 + i];
    dip <<= 1;
  }
  for (i = 0; i < 16; i++) {
    if (sp & 0x8000)
      res ^= key_cache[64 + i];
    sp <<= 1;
  }
  for (i = 0; i < 16; i++) {
    if (dp & 0x8000)
      res ^= key_cache[80 + i];
    dp <<= 1;
  }
  return res;
}
```