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

```asm
<u2h>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x5a8,%rsp
  mov    %rcx,0x8(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x598(%rsp)
  xor    %eax,%eax
  cmp    $0x3,%edx
  jle    L66
  mov    %rdi,%r12
  mov    %rsi,%r13
  mov    %edx,%ebx
  mov    %r8,%rbp
  cmp    $0x4,%edx
  je     L21
  test   %r8,%r8
  je     L5
  lea    0x30(%rsp),%r15
  lea    0x10(%rsp),%r14
  mov    %r15,%r8
  mov    %r14,%rcx
  call   <normu@plt>
  mov    %r15,%r9
  mov    %r14,%r8
  mov    %ebx,%ecx
  mov    %r13,%rdx
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <lin_hgN@plt>
  lea    (%rbx,%rbx,1),%edx
  lea    0x80(%rsp),%rbx
  mov    $0x9,%ecx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <cov_mat@plt>
  lea    0x310(%rsp),%rsi
  mov    $0x9,%edx
  mov    %rbx,%rdi
  call   <lap_eig@plt>
  mov    $0x48,%edx
  mov    %rbx,%rsi
  mov    0x8(%rsp),%rbx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %r15,%rdx
  mov    %r14,%rsi
  mov    %rbx,%rdi
  call   <denormH@plt>
L66:
  mov    0x598(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L1
  add    $0x5a8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L21:
  lea    0x310(%rsp),%rbx
  mov    $0x4,%ecx
  mov    %rsi,%rdx
  mov    %rbx,%rsi
  call   <lin_hg@plt>
  mov    $0x9,%esi
  mov    %rbx,%rdi
  call   <trnm@plt>
  lea    0x550(%rsp),%rax
  lea    0x598(%rsp),%rdx
L43:
  movq   $0x0,(%rax)
  add    $0x8,%rax
  cmp    %rdx,%rax
  jne    L43
  lea    0x30(%rsp),%rcx
  lea    0x80(%rsp),%rbx
  lea    0x310(%rsp),%rdi
  mov    $0x9,%edx
  mov    %rbx,%rsi
  call   <nullspace@plt>
  mov    $0x48,%edx
  mov    %rbx,%rsi
  mov    0x8(%rsp),%rdi
  call   <memcpy@plt>
  jmp    L66
L5:
  lea    (%rdx,%rdx,8),%edi
  shl    $0x4,%edi
  call   <malloc@plt>
  mov    %rax,%r15
  lea    0x30(%rsp),%r14
  lea    0x10(%rsp),%rbp
  mov    %r14,%r8
  mov    %rbp,%rcx
  mov    %ebx,%edx
  mov    %r13,%rsi
  mov    %r12,%rdi
  call   <normu@plt>
  mov    %r14,%r9
  mov    %rbp,%r8
  mov    %ebx,%ecx
  mov    %r13,%rdx
  mov    %r15,%rsi
  mov    %r12,%rdi
  call   <lin_hgN@plt>
  lea    (%rbx,%rbx,1),%edx
  lea    0x80(%rsp),%r12
  mov    $0x9,%ecx
  mov    %r15,%rsi
  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    0x8(%rsp),%rbx
  mov    %rbx,%rdi
  call   <memcpy@plt>
  mov    %r14,%rdx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <denormH@plt>
  mov    %r15,%rdi
  call   <free@plt>
  jmp    L66
L1:
  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);
    }
  }
}
```