user: What is the c source code of the assembly code below:

```asm
<rf_hyp2f1_core>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  movq   %xmm0,%r13
  mov    %edi,%ebp
  movq   %xmm1,%r12
  movapd %xmm2,%xmm0
  mov    %esi,%ebx
  mov    %edi,%r15d
  not    %r15d
  mov    $0x0,%edx
  mov    %edx,%edi
  call   <mpf_init_set_d@plt>
  mov    %ebx,%esi
  mov    $0x0,%ebx
  mov    %ebx,%edi
  call   <mpf_init2@plt>
  mov    $0x1,%esi
  mov    %ebx,%edi
  call   <mpf_set_si@plt>
  pxor   %xmm3,%xmm3
  cvtsi2sd %r15d,%xmm3
  movq   %r13,%xmm0
  movsd  %xmm3,0x8(%rsp)
  addsd  %xmm3,%xmm0
  mov    $0x0,%r14d
  mov    %r14d,%edi
  call   <mpf_init_set_d@plt>
  mov    $0xffffffff,%esi
  mov    $0x0,%r13d
  mov    %r13d,%edi
  call   <mpf_init_set_si@plt>
  movq   %r12,%xmm0
  addsd  0x8(%rsp),%xmm0
  mov    $0x0,%r12d
  mov    %r12d,%edi
  call   <mpf_init_set_d@plt>
  test   %r15d,%r15d
  js     L18
  neg    %ebp
L16:
  mov    $0x0,%edx
  mov    $0x0,%ebx
  mov    %ebx,%esi
  mov    %ebx,%edi
  call   <mpf_mul@plt>
  mov    $0x0,%r14d
  mov    %r14d,%edx
  mov    %ebx,%esi
  mov    %ebx,%edi
  call   <mpf_mul@plt>
  mov    $0x0,%r13d
  mov    %r13d,%edx
  mov    %ebx,%esi
  mov    %ebx,%edi
  call   <mpf_mul@plt>
  mov    %ebp,%edx
  mov    %ebx,%esi
  mov    %ebx,%edi
  call   <mpf_div_ui@plt>
  mov    $0x0,%r12d
  mov    %r12d,%edx
  mov    %ebx,%esi
  mov    %ebx,%edi
  call   <mpf_div@plt>
  mov    $0x1,%edx
  mov    %ebx,%esi
  mov    %ebx,%edi
  call   <mpf_add_ui@plt>
  mov    $0x1,%edx
  mov    %r14d,%esi
  mov    %r14d,%edi
  call   <mpf_sub_ui@plt>
  mov    $0x1,%edx
  mov    %r13d,%esi
  mov    %r13d,%edi
  call   <mpf_sub_ui@plt>
  mov    $0x1,%edx
  mov    %r12d,%esi
  mov    %r12d,%edi
  call   <mpf_sub_ui@plt>
  sub    $0x1,%ebp
  jne    L16
L18:
  mov    $0x0,%ebx
  mov    %ebx,%edi
  call   <mpf_get_d@plt>
  movq   %xmm0,%rbp
  mov    %ebx,%edi
  call   <mpf_clear@plt>
  mov    $0x0,%r14d
  mov    %r14d,%edi
  call   <mpf_clear@plt>
  mov    $0x0,%r13d
  mov    %r13d,%edi
  call   <mpf_clear@plt>
  mov    $0x0,%r12d
  mov    %r12d,%edi
  call   <mpf_clear@plt>
  mov    $0x0,%edx
  mov    %edx,%edi
  call   <mpf_clear@plt>
  movq   %rbp,%xmm0
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
double rf_hyp2f1_core(double a, int b, double c, double w, int mpf_prec) {
  double d_result;
  mpf_t ma, mb, mc, mw;
  mpf_t result;
  int i;
  int start_iter = -(b + 1);
  mpf_init_set_d(mw, w);
  mp_bitcnt_t prec = mpf_prec;
  mpf_init2(result, prec);
  mpf_set_si(result, 1);
  mpf_init_set_d(ma, a + start_iter);
  mpf_init_set_si(mb, b + start_iter);
  mpf_init_set_d(mc, c + start_iter);
  for (i = -(b + 1); i >= 0; i--) {
    mpf_mul(result, result, mw);
    mpf_mul(result, result, ma);
    mpf_mul(result, result, mb);
    mpf_div_ui(result, result, i + 1);
    mpf_div(result, result, mc);
    mpf_add_ui(result, result, 1);
    mpf_sub_ui(ma, ma, 1);
    mpf_sub_ui(mb, mb, 1);
    mpf_sub_ui(mc, mc, 1);
  }
  d_result = mpf_get_d(result);
  mpf_clear(result);
  mpf_clear(ma);
  mpf_clear(mb);
  mpf_clear(mc);
  mpf_clear(mw);
  return d_result;
}
```