user: 提供的汇编代码用C语言表示会是什么样子：

```asm
<upb_murmur_hash2>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x68(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %rdx,-0x78(%rbp)
  movq   $0x5bd1e995,-0x38(%rbp)
  movq   $0x18,-0x30(%rbp)
  mov    -0x68(%rbp),%rax
  mov    %rax,-0x58(%rbp)
  mov    -0x78(%rbp),%rax
  xor    -0x70(%rbp),%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x58(%rbp),%rax
  and    $0x3,%eax
  mov    %eax,-0x5c(%rbp)
  cmpl   $0x0,-0x5c(%rbp)
  je     L278
  cmpq   $0x3,-0x70(%rbp)
  jbe    L278
  movq   $0x0,-0x48(%rbp)
  movq   $0x0,-0x40(%rbp)
  cmpl   $0x3,-0x5c(%rbp)
  je     L171
  cmpl   $0x3,-0x5c(%rbp)
  jg     L201
  cmpl   $0x1,-0x5c(%rbp)
  je     L38
  cmpl   $0x2,-0x5c(%rbp)
  je     L319
  jmp    L201
L38:
  mov    -0x58(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  shl    $0x10,%eax
  cltq
  or     %rax,-0x48(%rbp)
L319:
  mov    -0x58(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  shl    $0x8,%eax
  cltq
  or     %rax,-0x48(%rbp)
L171:
  mov    -0x58(%rbp),%rax
  mov    (%rax),%eax
  cltq
  or     %rax,-0x48(%rbp)
L201:
  mov    -0x5c(%rbp),%eax
  shl    $0x3,%eax
  mov    %eax,%ecx
  shlq   %cl,-0x48(%rbp)
  mov    $0x4,%eax
  sub    -0x5c(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rax,-0x58(%rbp)
  mov    $0x4,%eax
  sub    -0x5c(%rbp),%eax
  cltq
  sub    %rax,-0x70(%rbp)
  mov    $0x4,%eax
  sub    -0x5c(%rbp),%eax
  shl    $0x3,%eax
  cltq
  mov    %rax,-0x28(%rbp)
  mov    -0x5c(%rbp),%eax
  shl    $0x3,%eax
  cltq
  mov    %rax,-0x20(%rbp)
  jmp    L327
L65:
  mov    -0x58(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0x40(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %eax,%edx
  mov    -0x48(%rbp),%rax
  mov    %edx,%ecx
  shr    %cl,%rax
  mov    %rax,%rsi
  mov    -0x28(%rbp),%rax
  mov    %eax,%edx
  mov    -0x40(%rbp),%rax
  mov    %edx,%ecx
  shl    %cl,%rax
  or     %rsi,%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rax
  mov    %edx,%ecx
  shr    %cl,%rax
  xor    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x50(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x10(%rbp),%rax
  xor    %rax,-0x50(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x48(%rbp)
  addq   $0x10,-0x58(%rbp)
  subq   $0x4,-0x70(%rbp)
L327:
  cmpq   $0x3,-0x70(%rbp)
  ja     L65
  movq   $0x0,-0x40(%rbp)
  mov    -0x5c(%rbp),%eax
  cltq
  cmp    %rax,-0x70(%rbp)
  jb     L346
  cmpl   $0x3,-0x5c(%rbp)
  je     L195
  cmpl   $0x3,-0x5c(%rbp)
  jg     L248
  cmpl   $0x1,-0x5c(%rbp)
  je     L40
  cmpl   $0x2,-0x5c(%rbp)
  je     L244
  jmp    L248
L195:
  mov    -0x58(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  shl    $0x10,%eax
  cltq
  or     %rax,-0x40(%rbp)
L244:
  mov    -0x58(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  shl    $0x8,%eax
  cltq
  or     %rax,-0x40(%rbp)
L40:
  mov    -0x58(%rbp),%rax
  mov    (%rax),%eax
  cltq
  or     %rax,-0x40(%rbp)
L248:
  mov    -0x20(%rbp),%rax
  mov    %eax,%edx
  mov    -0x48(%rbp),%rax
  mov    %edx,%ecx
  shr    %cl,%rax
  mov    %rax,%rsi
  mov    -0x28(%rbp),%rax
  mov    %eax,%edx
  mov    -0x40(%rbp),%rax
  mov    %edx,%ecx
  shl    %cl,%rax
  or     %rsi,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%ecx
  shr    %cl,%rax
  xor    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x50(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x18(%rbp),%rax
  xor    %rax,-0x50(%rbp)
  mov    -0x5c(%rbp),%eax
  cltq
  shl    $0x2,%rax
  add    %rax,-0x58(%rbp)
  mov    -0x5c(%rbp),%eax
  cltq
  sub    %rax,-0x70(%rbp)
  cmpq   $0x3,-0x70(%rbp)
  je     L178
  cmpq   $0x3,-0x70(%rbp)
  ja     L335
  cmpq   $0x1,-0x70(%rbp)
  je     L296
  cmpq   $0x2,-0x70(%rbp)
  je     L263
  jmp    L335
L178:
  mov    -0x58(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  shl    $0x10,%eax
  cltq
  xor    %rax,-0x50(%rbp)
L263:
  mov    -0x58(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  shl    $0x8,%eax
  cltq
  xor    %rax,-0x50(%rbp)
L296:
  mov    -0x58(%rbp),%rax
  mov    (%rax),%eax
  cltq
  xor    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x50(%rbp)
  jmp    L335
L346:
  cmpq   $0x3,-0x70(%rbp)
  je     L225
  cmpq   $0x3,-0x70(%rbp)
  ja     L335
  cmpq   $0x2,-0x70(%rbp)
  je     L14
  cmpq   $0x2,-0x70(%rbp)
  ja     L335
  cmpq   $0x0,-0x70(%rbp)
  je     L224
  cmpq   $0x1,-0x70(%rbp)
  je     L62
  jmp    L335
L225:
  mov    -0x58(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  shl    $0x10,%eax
  cltq
  or     %rax,-0x40(%rbp)
L14:
  mov    -0x58(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  shl    $0x8,%eax
  cltq
  or     %rax,-0x40(%rbp)
L62:
  mov    -0x58(%rbp),%rax
  mov    (%rax),%eax
  cltq
  or     %rax,-0x40(%rbp)
L224:
  mov    -0x20(%rbp),%rax
  mov    %eax,%edx
  mov    -0x48(%rbp),%rax
  mov    %edx,%ecx
  shr    %cl,%rax
  mov    %rax,%rsi
  mov    -0x28(%rbp),%rax
  mov    %eax,%edx
  mov    -0x40(%rbp),%rax
  mov    %edx,%ecx
  shl    %cl,%rax
  or     %rsi,%rax
  xor    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x50(%rbp)
L335:
  mov    -0x50(%rbp),%rax
  shr    $0xd,%rax
  xor    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  shr    $0xf,%rax
  xor    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  jmp    L303
L170:
  mov    -0x58(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  mov    %edx,%ecx
  shr    %cl,%rax
  xor    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x50(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x8(%rbp),%rax
  xor    %rax,-0x50(%rbp)
  addq   $0x10,-0x58(%rbp)
  subq   $0x4,-0x70(%rbp)
L278:
  cmpq   $0x3,-0x70(%rbp)
  ja     L170
  cmpq   $0x3,-0x70(%rbp)
  je     L122
  cmpq   $0x3,-0x70(%rbp)
  ja     L196
  cmpq   $0x1,-0x70(%rbp)
  je     L73
  cmpq   $0x2,-0x70(%rbp)
  je     L133
  jmp    L196
L122:
  mov    -0x58(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  shl    $0x10,%eax
  cltq
  xor    %rax,-0x50(%rbp)
L133:
  mov    -0x58(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  shl    $0x8,%eax
  cltq
  xor    %rax,-0x50(%rbp)
L73:
  mov    -0x58(%rbp),%rax
  mov    (%rax),%eax
  cltq
  xor    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x50(%rbp)
L196:
  mov    -0x50(%rbp),%rax
  shr    $0xd,%rax
  xor    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
  shr    $0xf,%rax
  xor    %rax,-0x50(%rbp)
  mov    -0x50(%rbp),%rax
L303:
  pop    %rbp
  ret
```

assistant: ```c
uint32_t upb_murmur_hash2(const void *key, size_t len, uint32_t seed) {
  const uint32_t m = 0x5bd1e995;
  const int32_t r = 24;
  const uint8_t *data = (const uint8_t *)key;
  uint32_t h = (uint32_t)(seed ^ len);
  uint8_t align = (uintptr_t)data & 3;
  if (align && (len >= 4)) {
    uint32_t t = 0, d = 0;
    int32_t sl;
    int32_t sr;
    switch (align) {
    case 1:
      t |= data[2] << 16;
    case 2:
      t |= data[1] << 8;
    case 3:
      t |= data[0];
    }
    t <<= (8 * align);
    data += 4 - align;
    len -= 4 - align;
    sl = 8 * (4 - align);
    sr = 8 * align;
    while (len >= 4) {
      uint32_t k;
      d = *(uint32_t *)data;
      t = (t >> sr) | (d << sl);
      k = t;
      {
        k *= m;
        k ^= k >> r;
        k *= m;
        h *= m;
        h ^= k;
      };
      t = d;
      data += 4;
      len -= 4;
    }
    d = 0;
    if (len >= align) {
      uint32_t k;
      switch (align) {
      case 3:
        d |= data[2] << 16;
      case 2:
        d |= data[1] << 8;
      case 1:
        d |= data[0];
      }
      k = (t >> sr) | (d << sl);
      {
        k *= m;
        k ^= k >> r;
        k *= m;
        h *= m;
        h ^= k;
      };
      data += align;
      len -= align;
      switch (len) {
      case 3:
        h ^= data[2] << 16;
      case 2:
        h ^= data[1] << 8;
      case 1:
        h ^= data[0];
        h *= m;
      };
    } else {
      switch (len) {
      case 3:
        d |= data[2] << 16;
      case 2:
        d |= data[1] << 8;
      case 1:
        d |= data[0];
      case 0:
        h ^= (t >> sr) | (d << sl);
        h *= m;
      }
    }
    h ^= h >> 13;
    h *= m;
    h ^= h >> 15;
    return h;
  } else {
    while (len >= 4) {
      uint32_t k = *(uint32_t *)data;
      {
        k *= m;
        k ^= k >> r;
        k *= m;
        h *= m;
        h ^= k;
      };
      data += 4;
      len -= 4;
    }
    switch (len) {
    case 3:
      h ^= data[2] << 16;
    case 2:
      h ^= data[1] << 8;
    case 1:
      h ^= data[0];
      h *= m;
    };
    h ^= h >> 13;
    h *= m;
    h ^= h >> 15;
    return h;
  }
}
```