user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<nlz_int128>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,%rax
  mov    %rsi,%rcx
  mov    %rcx,%rdx
  mov    %rax,-0x30(%rbp)
  mov    %rdx,-0x28(%rbp)
  movl   $0x80,-0x14(%rbp)
  mov    -0x30(%rbp),%rax
  mov    -0x28(%rbp),%rdx
  mov    %rdx,%rax
  xor    %edx,%edx
  mov    %rax,-0x10(%rbp)
  mov    %rdx,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  or     -0x10(%rbp),%rax
  test   %rax,%rax
  je     L68
  subl   $0x40,-0x14(%rbp)
  mov    -0x10(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  mov    %rax,-0x30(%rbp)
  mov    %rdx,-0x28(%rbp)
L68:
  mov    -0x30(%rbp),%rax
  mov    -0x28(%rbp),%rdx
  shrd   $0x20,%rdx,%rax
  shr    $0x20,%rdx
  mov    %rax,-0x10(%rbp)
  mov    %rdx,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  or     -0x10(%rbp),%rax
  test   %rax,%rax
  je     L50
  subl   $0x20,-0x14(%rbp)
  mov    -0x10(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  mov    %rax,-0x30(%rbp)
  mov    %rdx,-0x28(%rbp)
L50:
  mov    -0x30(%rbp),%rax
  mov    -0x28(%rbp),%rdx
  shrd   $0x10,%rdx,%rax
  shr    $0x10,%rdx
  mov    %rax,-0x10(%rbp)
  mov    %rdx,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  or     -0x10(%rbp),%rax
  test   %rax,%rax
  je     L9
  subl   $0x10,-0x14(%rbp)
  mov    -0x10(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  mov    %rax,-0x30(%rbp)
  mov    %rdx,-0x28(%rbp)
L9:
  mov    -0x30(%rbp),%rax
  mov    -0x28(%rbp),%rdx
  shrd   $0x8,%rdx,%rax
  shr    $0x8,%rdx
  mov    %rax,-0x10(%rbp)
  mov    %rdx,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  or     -0x10(%rbp),%rax
  test   %rax,%rax
  je     L59
  subl   $0x8,-0x14(%rbp)
  mov    -0x10(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  mov    %rax,-0x30(%rbp)
  mov    %rdx,-0x28(%rbp)
L59:
  mov    -0x30(%rbp),%rax
  mov    -0x28(%rbp),%rdx
  shrd   $0x4,%rdx,%rax
  shr    $0x4,%rdx
  mov    %rax,-0x10(%rbp)
  mov    %rdx,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  or     -0x10(%rbp),%rax
  test   %rax,%rax
  je     L19
  subl   $0x4,-0x14(%rbp)
  mov    -0x10(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  mov    %rax,-0x30(%rbp)
  mov    %rdx,-0x28(%rbp)
L19:
  mov    -0x30(%rbp),%rax
  mov    -0x28(%rbp),%rdx
  shrd   $0x2,%rdx,%rax
  shr    $0x2,%rdx
  mov    %rax,-0x10(%rbp)
  mov    %rdx,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  or     -0x10(%rbp),%rax
  test   %rax,%rax
  je     L35
  subl   $0x2,-0x14(%rbp)
  mov    -0x10(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  mov    %rax,-0x30(%rbp)
  mov    %rdx,-0x28(%rbp)
L35:
  mov    -0x30(%rbp),%rax
  mov    -0x28(%rbp),%rdx
  shrd   $0x1,%rdx,%rax
  shr    %rdx
  mov    %rax,-0x10(%rbp)
  mov    %rdx,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  or     -0x10(%rbp),%rax
  test   %rax,%rax
  je     L48
  mov    -0x14(%rbp),%eax
  sub    $0x2,%eax
  jmp    L37
L48:
  mov    -0x30(%rbp),%rax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  sub    %edx,%eax
L37:
  pop    %rbp
  ret
```

assistant: ```c
unsigned int nlz_int128(unsigned __int128 x) {
  unsigned __int128 y;
  unsigned int n = 128;
  y = x >> 64;
  if (y) {
    n -= 64;
    x = y;
  }
  y = x >> 32;
  if (y) {
    n -= 32;
    x = y;
  }
  y = x >> 16;
  if (y) {
    n -= 16;
    x = y;
  }
  y = x >> 8;
  if (y) {
    n -= 8;
    x = y;
  }
  y = x >> 4;
  if (y) {
    n -= 4;
    x = y;
  }
  y = x >> 2;
  if (y) {
    n -= 2;
    x = y;
  }
  y = x >> 1;
  if (y) {
    return n - 2;
  }
  return (unsigned int)(n - x);
}
```