user: 下面的汇编指令对应的C源代码是什么:

```asm
<timefunc>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,0x8(%rsp)
  mov    %rsi,%r13
  mov    $0xa1,%esi
  mov    $0x0,%ebx
  mov    %ebx,%edi
  call   <mpfr_init2@plt>
  mov    0x0(%r13),%rax
  mov    (%rax),%edi
  call   <mpfr_get_prec@plt>
  mov    %eax,%esi
  mov    $0x0,%r14d
  mov    %r14d,%edi
  call   <mpfr_init2@plt>
  mov    0x8(%r13),%rax
  mov    (%rax),%edi
  call   <mpfr_get_prec@plt>
  mov    %eax,%esi
  mov    $0x0,%ebp
  mov    %ebp,%edi
  call   <mpfr_init2@plt>
  mov    D2(%rip),%r12
  mov    0x0(%r13),%rax
  mov    (%r12),%edx
  mov    (%rax),%esi
  mov    %r14d,%edi
  call   <mpfr_set@plt>
  mov    0x8(%r13),%rax
  mov    (%r12),%edx
  mov    (%rax),%esi
  mov    %ebp,%edi
  call   <mpfr_set@plt>
  mov    $0xa1,%esi
  mov    $0x0,%r12d
  mov    %r12d,%edi
  call   <mpfr_init2@plt>
  mov    D47(%rip),%r15
  mov    (%r15),%edx
  mov    %r14d,%esi
  mov    %ebx,%edi
  call   <mpfr_set@plt>
  mov    0x10(%r13),%rax
  mov    (%rax),%ebx
  mov    (%r15),%ecx
  mov    %r14d,%edx
  mov    %ebp,%esi
  mov    %r12d,%edi
  call   <mpfr_sub@plt>
  mov    (%r15),%ecx
  mov    %ebx,%edx
  mov    %r12d,%esi
  mov    %r12d,%edi
  call   <mpfr_div_si@plt>
  mov    $0x0,%r13d
  jmp    L22
L5:
  mov    %r14d,%edi
  call   <_FPU_GETCW@plt>
  mov    D10(%rip),%rax
  movzwl (%rax),%edi
  not    %edi
  mov    D22(%rip),%rax
  and    (%rax),%di
  mov    D45(%rip),%rax
  or     (%rax),%di
  movzwl %di,%edi
  call   <_FPU_SETCW@plt>
  mov    %r14d,%edi
  call   <_FPU_SETCW@plt>
  mov    D47(%rip),%rax
  mov    (%rax),%ecx
  mov    $0x0,%r12d
  mov    %r12d,%edx
  mov    $0x0,%ebx
  mov    %ebx,%esi
  mov    %ebx,%edi
  call   <mpfr_add@plt>
  add    $0x1,%r13d
L22:
  mov    $0x0,%ebp
  mov    %ebp,%esi
  mov    $0x0,%ebx
  mov    %ebx,%edi
  call   <mpfr_cmp@plt>
  test   %rax,%rax
  jle    L5
  pxor   %xmm2,%xmm2
  movsd  %xmm2,(%rsp)
  test   %r13d,%r13d
  je     L15
  pxor   %xmm0,%xmm0
  cvtsi2sd %r13d,%xmm0
  movapd %xmm2,%xmm1
  divsd  %xmm0,%xmm1
  movsd  %xmm1,(%rsp)
L15:
  mov    $0x0,%ebp
  mov    %ebp,%edi
  call   <mpfr_clear@plt>
  mov    $0x0,%r14d
  mov    %r14d,%edi
  call   <mpfr_clear@plt>
  mov    $0x0,%ebx
  mov    %ebx,%edi
  call   <mpfr_clear@plt>
  mov    $0x0,%r12d
  mov    %r12d,%edi
  call   <mpfr_clear@plt>
  cvttsd2si (%rsp),%eax
  mov    0x8(%rsp),%rcx
  mov    %eax,(%rcx)
  mov    $0x1,%eax
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
int timefunc(int *timing, void **args) {
  unsigned short oldcw, cw;
  mpfr_t xMpfr;
  mpfr_t a, b;
  mpfr_t h;
  int steps, iterations, actualSteps;
  int i;
  uint64_t start, end;
  uint64_t usecs;
  double overalltime;
  mpfr_init2(xMpfr, 161);
  mpfr_init2(a, mpfr_get_prec(*((mpfr_t *)(args[0]))));
  mpfr_init2(b, mpfr_get_prec(*((mpfr_t *)(args[1]))));
  mpfr_set(a, *((mpfr_t *)(args[0])), GMP_RNDN);
  mpfr_set(b, *((mpfr_t *)(args[1])), GMP_RNDN);
  mpfr_init2(h, 161);
  mpfr_set(xMpfr, a, GMP_RNDU);
  steps = *((int *)(args[2]));
  iterations = *((int *)(args[3]));
  mpfr_sub(h, b, a, GMP_RNDU);
  mpfr_div_si(h, h, steps, GMP_RNDU);
  overalltime = 0;
  actualSteps = 0;
  while (mpfr_cmp(xMpfr, b) <= 0) {
    _FPU_GETCW(oldcw);
    cw = (_FPU_DEFAULT & ~_FPU_EXTENDED) | _FPU_DOUBLE;
    _FPU_SETCW(cw);
    _FPU_SETCW(oldcw);
    mpfr_add(xMpfr, xMpfr, h, GMP_RNDU);
    if (end >= start) {
      usecs = end - start;
      actualSteps++;
    } else {
      usecs = 0;
    }
    overalltime += usecs;
  }
  if (actualSteps != 0)
    overalltime /= actualSteps;
  mpfr_clear(b);
  mpfr_clear(a);
  mpfr_clear(xMpfr);
  mpfr_clear(h);
  *timing = overalltime;
  return 1;
}
```