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

```asm
<fp_log_m1>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %esi,-0x28(%rbp)
  mov    %edx,-0x2c(%rbp)
  mov    -0x2c(%rbp),%eax
  test   %rax,%rax
  js     L19
  pxor   %xmm0,%xmm0
  cvtsi2sd %rax,%xmm0
  jmp    L35
L19:
  mov    %rax,%rdx
  shr    %rdx
  and    $0x1,%eax
  or     %rax,%rdx
  pxor   %xmm0,%xmm0
  cvtsi2sd %rdx,%xmm0
  addsd  %xmm0,%xmm0
L35:
  movsd  D10(%rip),%xmm1
  mulsd  %xmm0,%xmm1
  movsd  D19(%rip),%xmm0
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  mov    -0x8(%rbp),%rdx
  mov    -0x18(%rbp),%eax
  movq   %rdx,%xmm0
  mov    %eax,%edi
  call   <mpf_init2@plt>
  mov    -0x8(%rbp),%rdx
  mov    -0x14(%rbp),%eax
  movq   %rdx,%xmm0
  mov    %eax,%edi
  call   <mpf_init2@plt>
  mov    -0x8(%rbp),%rdx
  mov    -0x10(%rbp),%eax
  movq   %rdx,%xmm0
  mov    %eax,%edi
  call   <mpf_init2@plt>
  mov    -0x28(%rbp),%edx
  mov    -0x18(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <mpf_set@plt>
  mov    -0x18(%rbp),%edx
  mov    -0x18(%rbp),%ecx
  mov    -0x14(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <mpf_mul@plt>
  mov    -0x18(%rbp),%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <mpf_set@plt>
  mov    -0x8(%rbp),%rdx
  mov    -0xc(%rbp),%eax
  movq   %rdx,%xmm0
  mov    %eax,%edi
  call   <mpf_init2@plt>
  mov    -0x2c(%rbp),%edx
  mov    -0xc(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <fp_epsilon@plt>
  movl   $0x2,-0x1c(%rbp)
L15:
  mov    -0x1c(%rbp),%edx
  mov    -0x14(%rbp),%ecx
  mov    -0x10(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <mpf_div_ui@plt>
  mov    -0x10(%rbp),%edx
  mov    -0x24(%rbp),%ecx
  mov    -0x24(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <mpf_add@plt>
  mov    -0x10(%rbp),%edx
  mov    -0x10(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <mpf_abs@plt>
  mov    -0xc(%rbp),%edx
  mov    -0x10(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <mpf_cmp@plt>
  test   %rax,%rax
  js     L21
  addl   $0x1,-0x1c(%rbp)
  mov    -0x18(%rbp),%edx
  mov    -0x14(%rbp),%ecx
  mov    -0x14(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <mpf_mul@plt>
  jmp    L15
L21:
  nop
  mov    -0x18(%rbp),%eax
  mov    %eax,%edi
  call   <mpf_clear@plt>
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <mpf_clear@plt>
  mov    -0x10(%rbp),%eax
  mov    %eax,%edi
  call   <mpf_clear@plt>
  mov    -0xc(%rbp),%eax
  mov    %eax,%edi
  call   <mpf_clear@plt>
  nop
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: data_label: D10
type_infered: f64
name: retrieve_data
arguments: data_label: D19
type_infered: byte[8]

tool: D10: 3.322

tool: {"D19": [0x00,0x00,0x00,0x00,0x00,0x00,0x49,0x40]}

assistant: ```c
void fp_log_m1(mpf_t lg, const mpf_t z, unsigned int prec) {
  mp_bitcnt_t bits = ((double)prec) * 3.322 + 50;
  mpf_t zee, z_n, term;
  mpf_init2(zee, bits);
  mpf_init2(z_n, bits);
  mpf_init2(term, bits);
  mpf_set(zee, z);
  mpf_mul(z_n, zee, zee);
  mpf_set(lg, zee);
  mpf_t maxterm;
  mpf_init2(maxterm, bits);
  fp_epsilon(maxterm, prec);
  unsigned int n = 2;
  while (1) {
    mpf_div_ui(term, z_n, n);
    mpf_add(lg, lg, term);
    mpf_abs(term, term);
    if (mpf_cmp(term, maxterm) < 0)
      break;
    n++;
    mpf_mul(z_n, z_n, zee);
  }
  mpf_clear(zee);
  mpf_clear(z_n);
  mpf_clear(term);
  mpf_clear(maxterm);
}
```