user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<u2h>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x5a8,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x598(%rsp)
  xor    %eax,%eax
  cmp    $0x3,%edx
  jle    L23
  mov    %rdi,%r14
  mov    %rsi,%r15
  mov    %edx,%r12d
  mov    %rcx,%r13
  cmp    $0x4,%edx
  je     L26
  lea    (%rdx,%rdx,1),%r10d
  mov    %r8,%rbp
  mov    %r10d,0xc(%rsp)
  test   %r8,%r8
  je     L50
  lea    0x30(%rsp),%r9
  lea    0x10(%rsp),%rbx
  mov    %r9,%r8
  mov    %rbx,%rcx
  mov    %r9,(%rsp)
  call   <normu@plt>
  mov    (%rsp),%r9
  mov    %rbx,%r8
  mov    %r12d,%ecx
  mov    %r15,%rdx
  mov    %rbp,%rsi
  mov    %r14,%rdi
  call   <lin_hgN@plt>
  lea    0x80(%rsp),%r12
  mov    0xc(%rsp),%edx
  mov    %rbp,%rsi
  mov    $0x9,%ecx
  mov    %r12,%rdi
  call   <cov_mat@plt>
  lea    0x310(%rsp),%rsi
  mov    $0x9,%edx
  mov    %r12,%rdi
  call   <lap_eig@plt>
  mov    $0x48,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <memcpy@plt>
  mov    (%rsp),%rdx
  mov    %rbx,%rsi
  mov    %r13,%rdi
  call   <denormH@plt>
L23:
  mov    0x598(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L8
  add    $0x5a8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   (%rax)
L50:
  lea    (%rdx,%rdx,8),%edi
  lea    0x10(%rsp),%rbx
  shl    $0x4,%edi
  call   <malloc@plt>
  lea    0x30(%rsp),%r9
  mov    %rbx,%rcx
  mov    %r12d,%edx
  mov    %r9,%r8
  mov    %r15,%rsi
  mov    %r14,%rdi
  mov    %rax,%rbp
  mov    %r9,(%rsp)
  call   <normu@plt>
  mov    (%rsp),%r9
  mov    %rbx,%r8
  mov    %r12d,%ecx
  mov    %r15,%rdx
  mov    %rbp,%rsi
  mov    %r14,%rdi
  call   <lin_hgN@plt>
  lea    0x80(%rsp),%r12
  mov    0xc(%rsp),%edx
  mov    %rbp,%rsi
  mov    $0x9,%ecx
  mov    %r12,%rdi
  call   <cov_mat@plt>
  lea    0x310(%rsp),%rsi
  mov    %r12,%rdi
  mov    $0x9,%edx
  call   <lap_eig@plt>
  mov    %r12,%rsi
  mov    %r13,%rdi
  mov    $0x48,%edx
  call   <memcpy@plt>
  mov    (%rsp),%rdx
  mov    %r13,%rdi
  mov    %rbx,%rsi
  call   <denormH@plt>
  mov    %rbp,%rdi
  call   <free@plt>
  jmp    L23
  nopl   (%rax)
L26:
  lea    0x310(%rsp),%rbp
  mov    %rsi,%rdx
  mov    $0x4,%ecx
  mov    %rbp,%rsi
  lea    0x80(%rsp),%r12
  call   <lin_hg@plt>
  mov    %rbp,%rdi
  mov    $0x9,%esi
  call   <trnm@plt>
  pxor   %xmm0,%xmm0
  mov    %r12,%rsi
  mov    %rbp,%rdi
  lea    0x30(%rsp),%rcx
  mov    $0x9,%edx
  movq   $0x0,0x590(%rsp)
  movaps %xmm0,0x550(%rsp)
  movaps %xmm0,0x560(%rsp)
  movaps %xmm0,0x570(%rsp)
  movaps %xmm0,0x580(%rsp)
  call   <nullspace@plt>
  mov    $0x48,%edx
  mov    %r12,%rsi
  mov    %r13,%rdi
  call   <memcpy@plt>
  jmp    L23
L8:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void u2h(const double *u, const int *inl, int len, double *H, double *buffer) {
  double A1[3], A2[3];
  double *Z, V[9 * 9], D[9];
  int i, nullspace_buff[2 * 9];
  if (len < 4) {
    return;
  } else if (len == 4) {
    double Z2[9 * 9];
    lin_hg(u, Z2, inl, len);
    trnm(Z2, 9);
    for (i = 9 * 8; i < 9 * 9; ++i) {
      Z2[i] = 0.0;
    }
    nullspace(Z2, V, 9, nullspace_buff);
    memcpy(H, V, 3 * 3 * sizeof(double));
  } else {
    if (!buffer) {
      Z = (double *)malloc(sizeof(double) * 9 * len * 2);
    } else {
      Z = buffer;
    }
    normu(u, inl, len, A1, A2);
    lin_hgN(u, Z, inl, len, A1, A2);
    cov_mat(V, Z, 2 * len, 9);
    lap_eig(V, D, 9);
    memcpy(H, V, 3 * 3 * sizeof(double));
    denormH(H, A1, A2);
    if (!buffer) {
      free(Z);
    }
  }
}
```