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

```asm
<f64ToRecF64>:
  endbr64
  push   %r14
  mov    $0x34,%ecx
  mov    %rdx,%r14
  push   %r13
  mov    %esi,%r13d
  push   %r12
  mov    %edi,%r12d
  push   %rbp
  mov    %edi,%ebp
  shr    $0x1f,%r12d
  push   %rbx
  mov    %edi,%ebx
  mov    $0xffffffff,%edi
  sar    %cl,%ebx
  and    $0x7ff,%ebx
  call   <UINT64_C@plt>
  and    %eax,%ebp
  cmp    $0x7ff,%ebx
  je     L47
  test   %ebx,%ebx
  jne    L32
  cmp    $0xfffff,%ebp
  jg     L4
  test   %ebp,%ebp
  je     L20
L6:
  xor    %edi,%edi
  call   <INT64_C@plt>
  mov    %eax,%r8d
  mov    %ebx,%eax
  shl    $0x10,%eax
  cmp    %ebx,%r8d
  cmovg  %eax,%ebx
  xor    %edi,%edi
  call   <INT64_C@plt>
  mov    %eax,%r8d
  mov    %ebx,%eax
  shl    $0x8,%eax
  cmp    %ebx,%r8d
  cmovg  %eax,%ebx
  xor    %edi,%edi
  call   <INT64_C@plt>
  mov    %eax,%r8d
  mov    %ebx,%eax
  shl    $0x4,%eax
  cmp    %ebx,%r8d
  cmovg  %eax,%ebx
  xor    %edi,%edi
  call   <INT64_C@plt>
  mov    %eax,%r8d
  lea    0x0(,%rbx,4),%eax
  cmp    %ebx,%r8d
  cmovg  %eax,%ebx
  xor    %edi,%edi
  call   <INT64_C@plt>
  mov    %eax,%r8d
  lea    (%rbx,%rbx,1),%eax
  test   %ebx,%r8d
  cmove  %eax,%ebx
  xor    %edi,%edi
  call   <INT64_C@plt>
  lea    (%rbx,%rbx,1),%ebp
  sub    %eax,%ebp
L32:
  pop    %rbx
  mov    %r12d,0x4(%r14)
  mov    %ebp,(%r14)
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   0x0(%rax,%rax,1)
L47:
  test   %ebp,%ebp
  je     L8
L20:
  test   %r13d,%r13d
  jne    L76
  pop    %rbx
  mov    %r12d,0x4(%r14)
  mov    %ebp,(%r14)
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   0x0(%rax)
L8:
  test   %r13d,%r13d
  je     L32
  xor    %eax,%eax
  call   <rand@plt>
  xor    %eax,%eax
  call   <rand@plt>
  mov    %eax,%ebp
  xor    %eax,%eax
  call   <rand@plt>
  shl    $0x1e,%ebp
  shl    $0xf,%eax
  add    %eax,%ebp
  xor    %eax,%eax
  call   <rand@plt>
  mov    $0xffffffff,%edi
  add    %eax,%ebp
  call   <UINT64_C@plt>
  and    %eax,%ebp
L76:
  xor    %eax,%eax
  call   <rand@plt>
  pop    %rbx
  mov    %r12d,0x4(%r14)
  mov    %ebp,(%r14)
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   0x0(%rax,%rax,1)
L4:
  mov    %ebp,%ebx
  jmp    L6
```

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;
}
```