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

```asm
<f64ToRecF64>:
  endbr64
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %edi,%ebp
  mov    %esi,%r14d
  mov    %rdx,%r12
  mov    %edi,%r13d
  shr    $0x1f,%r13d
  mov    %edi,%ebx
  mov    $0x34,%ecx
  sar    %cl,%ebx
  and    $0x7ff,%ebx
  mov    $0xffffffff,%edi
  call   <UINT64_C@plt>
  and    %eax,%ebp
  cmp    $0x7ff,%ebx
  je     L63
  test   %ebx,%ebx
  jne    L20
  cmp    $0xfffff,%ebp
  jg     L43
  test   %ebp,%ebp
  je     L8
L125:
  mov    $0x0,%edi
  call   <INT64_C@plt>
  mov    %eax,%edx
  mov    %ebx,%eax
  shl    $0x10,%eax
  cmp    %ebx,%edx
  cmovg  %eax,%ebx
  mov    $0x0,%edi
  call   <INT64_C@plt>
  mov    %eax,%edx
  mov    %ebx,%eax
  shl    $0x8,%eax
  cmp    %ebx,%edx
  cmovg  %eax,%ebx
  mov    $0x0,%edi
  call   <INT64_C@plt>
  mov    %eax,%edx
  mov    %ebx,%eax
  shl    $0x4,%eax
  cmp    %ebx,%edx
  cmovg  %eax,%ebx
  mov    $0x0,%edi
  call   <INT64_C@plt>
  mov    %eax,%edx
  lea    0x0(,%rbx,4),%eax
  cmp    %ebx,%edx
  cmovg  %eax,%ebx
  mov    $0x0,%edi
  call   <INT64_C@plt>
  mov    %eax,%edx
  lea    (%rbx,%rbx,1),%eax
  test   %ebx,%edx
  cmove  %eax,%ebx
  lea    (%rbx,%rbx,1),%ebp
  mov    $0x0,%edi
  call   <INT64_C@plt>
  sub    %eax,%ebp
L20:
  mov    %r13d,0x4(%r12)
  mov    %ebp,(%r12)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L63:
  test   %r14d,%r14d
  je     L65
  test   %ebp,%ebp
  je     L117
L65:
  test   %r14d,%r14d
  je     L20
  jmp    L70
L117:
  mov    $0x0,%eax
  call   <rand@plt>
  mov    $0x0,%eax
  call   <rand@plt>
  mov    %eax,%ebp
  mov    $0x0,%eax
  call   <rand@plt>
  shl    $0x1e,%ebp
  shl    $0xf,%eax
  add    %eax,%ebp
  mov    $0x0,%eax
  call   <rand@plt>
  add    %eax,%ebp
  mov    $0xffffffff,%edi
  call   <UINT64_C@plt>
  and    %eax,%ebp
L70:
  mov    $0x0,%eax
  call   <rand@plt>
  jmp    L20
L8:
  test   %r14d,%r14d
  jne    L3
  mov    %r14d,%ebp
  jmp    L20
L3:
  mov    $0x0,%eax
  call   <rand@plt>
  jmp    L20
L43:
  mov    %ebp,%ebx
  jmp    L125
```

assistant: ```c
void f64ToRecF64(uint64_t in, bool addRandomness, uint64_t *outPtr) {
  bool sign;
  int exp;
  int_fast64_t fract;
  sign = in >> 63 & 1;
  exp = in >> 52 & 0x7FF;
  fract = in & UINT64_C(0xFFFFFFFFFFFFF);
  if (exp == 0x7FF) {
    if (fract) {
      exp = 0xE00;
    } else {
      exp = 0xC00;
      if (addRandomness) {
        fract = (((uint_fast64_t)rand() << 45) + ((uint_fast64_t)rand() << 30) + ((uint_fast64_t)rand() << 15) + rand()) & UINT64_C(0xFFFFFFFFFFFFF);
      }
    }
    if (addRandomness)
      exp |= rand() & 0x1FF;
  } else {
    if (exp == 0) {
      if (fract < 0x100000) {
        if (!fract) {
          if (addRandomness)
            exp = rand() & 0x1FF;
          goto done;
        }
        exp -= 32;
        fract <<= 32;
      }
      if (fract < INT64_C(0x1000000000)) {
        exp -= 16;
        fract <<= 16;
      }
      if (fract < INT64_C(0x100000000000)) {
        exp -= 8;
        fract <<= 8;
      }
      if (fract < INT64_C(0x1000000000000)) {
        exp -= 4;
        fract <<= 4;
      }
      if (fract < INT64_C(0x4000000000000)) {
        exp -= 2;
        fract <<= 2;
      }
      if (!(fract & INT64_C(0x8000000000000))) {
        --exp;
        fract <<= 1;
      }
      fract = (fract << 1) - INT64_C(0x10000000000000);
    }
    exp += 0x401;
  }
done:
  outPtr[1] = sign;
  outPtr[0] = (uint_fast64_t)exp << 52 | fract;
}
```