user: What would the C source look like for the assembly code provided here:

```asm
<upb_murmur_hash2>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%r9
  mov    %rsi,%rdi
  mov    %rdx,%rax
  xor    %rsi,%rax
  mov    %r9d,%ebx
  and    $0x3,%ebx
  je     L228
  cmp    $0x3,%rsi
  jbe    L228
  cmp    $0x2,%ebx
  je     L253
  cmp    $0x3,%ebx
  je     L50
  mov    $0x0,%esi
  cmp    $0x1,%ebx
  jne    L232
  mov    0x8(%r9),%ecx
  shl    $0x10,%ecx
  movslq %ecx,%rcx
L246:
  mov    0x4(%r9),%edx
  shl    $0x8,%edx
  movslq %edx,%rdx
  or     %rcx,%rdx
L131:
  movslq (%r9),%rsi
  or     %rdx,%rsi
L232:
  lea    0x0(,%rbx,8),%ecx
  shl    %cl,%rsi
  mov    $0x4,%r10d
  sub    %ebx,%r10d
  movslq %r10d,%rdx
  lea    (%r9,%rdx,4),%rbp
  sub    %rdx,%rdi
  shl    $0x3,%r10d
  movslq %r10d,%r10
  movslq %ecx,%r11
  cmp    $0x3,%rdi
  jbe    L191
  mov    %rbp,%r9
  mov    %rdi,%r8
L68:
  mov    %rsi,%r12
  mov    (%r9),%rsi
  mov    %r11d,%ecx
  shr    %cl,%r12
  mov    %rsi,%rdx
  mov    %r10d,%ecx
  shl    %cl,%rdx
  or     %r12,%rdx
  imul   $0x5bd1e995,%rdx,%rdx
  mov    %rdx,%rcx
  shr    $0x18,%rcx
  xor    %rcx,%rdx
  imul   $0x5bd1e995,%rax,%rax
  imul   $0x5bd1e995,%rdx,%rdx
  xor    %rdx,%rax
  add    $0x10,%r9
  sub    $0x4,%r8
  cmp    $0x3,%r8
  ja     L68
  lea    -0x4(%rdi),%rdx
  shr    $0x2,%rdx
  add    $0x1,%rdx
  shl    $0x4,%rdx
  add    %rdx,%rbp
  and    $0x3,%edi
L191:
  movslq %ebx,%r8
  cmp    %rdi,%r8
  ja     L87
  cmp    $0x2,%ebx
  je     L178
  cmp    $0x3,%ebx
  je     L141
  mov    $0x0,%r9d
  cmp    $0x1,%ebx
  jne    L46
  mov    $0x0,%edx
  jmp    L134
L228:
  mov    %r9,%rsi
  mov    %rdi,%rcx
  cmp    $0x3,%rdi
  jbe    L93
L16:
  imul   $0x5bd1e995,(%rsi),%r8
  mov    %r8,%rdx
  shr    $0x18,%rdx
  xor    %r8,%rdx
  imul   $0x5bd1e995,%rax,%rax
  imul   $0x5bd1e995,%rdx,%rdx
  xor    %rdx,%rax
  add    $0x10,%rsi
  sub    $0x4,%rcx
  cmp    $0x3,%rcx
  ja     L16
  lea    -0x4(%rdi),%rdx
  shr    $0x2,%rdx
  add    $0x1,%rdx
  shl    $0x4,%rdx
  add    %rdx,%r9
  and    $0x3,%edi
L93:
  cmp    $0x2,%rdi
  je     L111
  cmp    $0x3,%rdi
  je     L245
  cmp    $0x1,%rdi
  jne    L24
  jmp    L291
L253:
  mov    $0x0,%ecx
  jmp    L246
L50:
  mov    $0x0,%edx
  jmp    L131
L141:
  mov    0x8(%rbp),%ecx
  shl    $0x10,%ecx
  movslq %ecx,%rcx
L31:
  mov    0x4(%rbp),%edx
  shl    $0x8,%edx
  movslq %edx,%rdx
  or     %rcx,%rdx
L134:
  movslq 0x0(%rbp),%r9
  or     %rdx,%r9
L46:
  mov    %r11d,%ecx
  shr    %cl,%rsi
  mov    %rsi,%rdx
  mov    %r10d,%ecx
  shl    %cl,%r9
  or     %r9,%rdx
  imul   $0x5bd1e995,%rdx,%rcx
  mov    %rcx,%rdx
  shr    $0x18,%rdx
  xor    %rcx,%rdx
  imul   $0x5bd1e995,%rax,%rcx
  imul   $0x5bd1e995,%rdx,%rax
  xor    %rcx,%rax
  lea    0x0(%rbp,%r8,4),%rcx
  sub    %r8,%rdi
  cmp    $0x2,%rdi
  je     L205
  cmp    $0x3,%rdi
  je     L113
  cmp    $0x1,%rdi
  jne    L63
  jmp    L255
L178:
  mov    $0x0,%ecx
  jmp    L31
L113:
  mov    0x8(%rcx),%edx
  shl    $0x10,%edx
  movslq %edx,%rdx
  xor    %rdx,%rax
L205:
  mov    0x4(%rcx),%edx
  shl    $0x8,%edx
  movslq %edx,%rdx
  xor    %rdx,%rax
L255:
  movslq (%rcx),%rdx
  xor    %rdx,%rax
  imul   $0x5bd1e995,%rax,%rax
  jmp    L63
L87:
  cmp    $0x2,%rdi
  je     L268
  mov    $0x0,%edx
  test   %rdi,%rdi
  je     L52
L217:
  movslq 0x0(%rbp),%rdi
  or     %rdx,%rdi
L52:
  mov    %r11d,%ecx
  shr    %cl,%rsi
  mov    %r10d,%ecx
  shl    %cl,%rdi
  or     %rdi,%rsi
  xor    %rax,%rsi
  imul   $0x5bd1e995,%rsi,%rax
L63:
  mov    %rax,%rdx
  shr    $0xd,%rdx
  xor    %rax,%rdx
  imul   $0x5bd1e995,%rdx,%rdx
  mov    %rdx,%rax
  shr    $0xf,%rax
  xor    %rdx,%rax
L34:
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L268:
  mov    0x4(%rbp),%edx
  shl    $0x8,%edx
  movslq %edx,%rdx
  jmp    L217
L245:
  mov    0x8(%r9),%edx
  shl    $0x10,%edx
  movslq %edx,%rdx
  xor    %rdx,%rax
L111:
  mov    0x4(%r9),%edx
  shl    $0x8,%edx
  movslq %edx,%rdx
  xor    %rdx,%rax
L291:
  movslq (%r9),%rdx
  xor    %rdx,%rax
  imul   $0x5bd1e995,%rax,%rax
L24:
  mov    %rax,%rdx
  shr    $0xd,%rdx
  xor    %rax,%rdx
  imul   $0x5bd1e995,%rdx,%rdx
  mov    %rdx,%rax
  shr    $0xf,%rax
  xor    %rdx,%rax
  jmp    L34
```

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;
  }
}
```